Introduction

Prioritisation can largely be broken into two steps – geographic prioritisation and beneficiary selection.

This document examines data from the FAO-WFP Shocks, Agricultural Livelihoods and Food Security Survey, the Armed Conflict Location and Event Dataset (ACLED) and the Myanmar Information Management Unit (MIMU).

The first section deals with the development of core beneficiary selection criteria using the FAO-WFP survey data. The second section makes use of ACLED data for Myanmar to develop a conflict score for township prioritisation. Township and beneficiary selection criteria are linked by a decision tree. The third section presents flood risks by township – these are only probabilities and serve as references for prepositioning and disaster risk reduction. They not included in the overall prioritisation process, though this might change if disasters occur.

References for this report

  • ACLED (2022). ACLED data for Myanmar (2010-2022). https://acleddata.com.
  • Atillio Benini, Aldo Benini (2021). mdepriv: Synthetic scores of multiple deprivation. R package version 0.0.3. https://github.com/a-benini/mdepriv/.
  • FAO and WFP (2022). Myanmar | Shocks, agricultural livelihoods and food security: Monitoring report, March 2022. Rome.
  • Food Security Cluster, Myanmar (2021). 5Ws reporting tool.
  • HARP-F and MIMU (2018). Vulnerability in Myanmar: A Secondary Data Review of Needs, Coverage and Gaps. http://themimu.info/vulnerability-in-myanmar.




1. Beneficiary Selection using FAO-WFP survey data

A total of 2708 households were interviewed in the FAO-WFP Shocks, Agricultural Livelihoods and Food Security Survey in Ayeyarwady, Kachin, Kayah, Kayin, Mon, Rakhine, Shan and Yangon to monitor food security and livelihoods of persons in Myanmar. Some of the most key data collected were on the various food security indices – the Food Consumption Score (FCS), the Food Insecurity Experience Scale (FIES) and the Livelihood Coping Strategies Index (CSI). Additionally, a composite of the three indices, the Food Security Score has also been calculated. Information was also collected on basic household demographics as well on income sources. Much more detail can be gleaned from the report itself – this document focuses only on the aspects of the survey which can be used for prioritisation.



1.1 An overview of the food security indicators

The plot below ranks variables in order of their ability to predict the various food insecurity composite indices. Only environmental or demographic variables were taken into account as it would be redundant to predict food security indices using the components of said indices. Only responses that occurred more than 200 times (out of 2,708) in the survey were considered.

Variables that are more red are most likely to result in high food insecurity scores (that is, higher food insecurity) and variables that are more blue are more likely to result in lower food insecurity scores. The dotted red line down the middle at x=0 splits variables into whether the predict higher food insecurity (positive numbers) or lower food insecurity (negative numbers).



The plots above ranks variables in order of their ability to predict the various food security composite indices. Variables that are more red are more likely to result in high food insecurity scores (that is, higher food insecurity) and variables that are more blue are more likely to results in lower food insecurity scores.

The variables that are the most important in predicting high food security scores are a household’s exposure to conflict, whether or not they lost employment or work opportunities, whether or not they were engaged in casual non-agricultural labour and whether or not they reported no income in the three months prior to the survey.

These variables can be thought of as a preliminary list of beneficiary selection criteria for food security and livelihoods programming. This list is, of course, non-exhaustive as it only includes variables that were included in the FAO-WFP survey.

The variables that were the best predictors of low food insecurity were whether or not the head of household had completed higher education and whether or not the main income source of the household was stable non-agricultural employment.



1.2 Setting a threshold for prioritisation

An important step is narrowing down the population to a priority group – Food Security Cluster partners do not have the resources to target all persons.

A household was considered to be a priority for intervention when they were above the 75th percentile in at least two out of the three food security indices (food consumption score, coping strategies index and food insecurity experience scale)

Approximately 34% of the total population falls into this priority group. The plot below shows the food security sub-indicators that are the most important in determining whether a household falls into the priority group or not.

The plots below shows the differences between the average values of food security index components based on whether they are priority households or not. Variables in blue correspond to Coping Strategies Index indicators, those in red to the Food Insecurity Experience Scale.

Those in green correspond to the Food Consumption Score – for these indicators, they have been rescaled so that a value of 1 shows that a household has not consumed that food group at all in the previous 7 days and a value of 0 shows that they have consumed that food group every day for the past 7 days.



Whilst both groups tend to consume low amounts of dairy, pulses, sugar and fruits, these trends are much more pronounced in the priority group. Additionally, households in the priority group are more than twice as likely to have poor protein consumption, be worried about not having enough food and eat less due to a lack of resources.

Households in the priority group were also more than four times as likely to have reduced healthcare expenditures, have sold productive assets and be unable to eat healthy and nutritious foods and eat only a few kinds of foods. They are also more than five times as likley to skipped meals or gone hungry.



1.3 Decision tree

However large the differences are between the food security statuses of those in the priority group and those outside of it, many of these indicators are not easily observable. It would be quite challenging to conduct a large-scale comprehensive food security survey prior to what FAO-WFP have done.

This necessitates the creation of simple tool to aid in prioritisation. A simple tree has been developed, considering only the variables in the FAO-WFP survey that are easily observable. The tree below takes into account only three variables – whether or not a household is in a rural area, whether or not they have experienced violence, insecurity or conflict in the past three months and whether or not they have lost work or employment opportunities in the past three months.

Within each blue square, the figure in bold show the percentage of each group that are priority households and the figures in italics show the percentage of the overall population in each node.


Decision tree

The percentage of priority households in rural areas is much higher than in urban ones (37.6% vs 26.1%). For rural areas, the indicator that best distinguishes priority households is whether or they have directly experienced violence, insecurity or conflict in the past three months. The factor that best distinguishes priority households in urban areas is whether or not they have lost work or employment opportunities in the past three months.

The performance of the decision tree is not exactly spectacular – if a partner wanted to target an entire community, the threshold for blanket coverage would be around 75% or 80% being in the priority group. But the decision tree is very simple and understandable (and all the regression models developed were very weak). Additional beneficiary selection criteria will be necessary, but this decision tree does at least give some direction for geographic prioritisation, which is discussed in the next section.



1.4 Exceptions for targeting agricultural households

64.7% of the total population is in the tree node [6] (the nodes are all numbered in the decision tree above) – within this group are households who reside in rural areas but have not been affected by violence, conflict or insecurity. Given that this is a significant chunk of the population where, with reference to the plot below, 78% of the population is involved in agriculture, an exception can be made in this one instance, to support partners who want to target agricultural households who have not been affected by the conflict.

It must still be mentioned that aid flow first to the households in node [7], where the proportion of households in the priority group is highest. Only after the needs of this population are met should households in node [6] be targeted.



The tree below carries on from node [6] of the main decision tree in the section above. Within this group of rural households not affected by conflict (64.7% of the total population), identifying households who have lost access to markets due to conflict, infrastructure damage or other access issues and households who have been affected by natural hazards (the most common of which is flooding) improves the chances of targeting households in the priority group to slightly above 50%.

Any further conditions applied on the tree only result in extremely marginal gains.


Decision tree – from tree node [6]


It is perhaps best to target priority households in these areas by establishing clear beneficiary selection criteria. The plot below shows the best predictors of food insecurity within the households in node [6].

The variables within the FAO-WFP survey most of use to partners targeting priority households in node [6] are whether or not a household has improved sanitation and the educational attainment of the head of the household. The most important shocks for this group were natural hazards and the loss of work or employment opportunities. As noted earlier, no households in this group have been affected by conflict.




1.5 Impact of conflict on food security

Conflict has a real, though quite limited impact on food security. Though the FAO-WFP survey was not developed with measuring the impact of conflict in mind, it is nevertheless possible to control for some factors and examine the impact of conflict on several groups.

The plot below shows the impact on the overall food security scores based on whether a household has been impacted by conflict or not. We have selected the two largest groups within the rural and urban context (farmers and workers employed in stable, non-agricultural employment) and have split these populations by education level.



The food security scores of all groups except one are higher when a household has experienced conflict. This by no means constitutes a scientific proof (another survey would have to be conducted), but it is possible to state with some confidence that exposure to conflict has a negative impact on food security. And in the next section, conflict scores will be used to prioritise between townships.

To close, below is a table summarising the percentage difference in food security scores of each group. At this point, the Food Security Cluster is unable to estimate with any confidence, an estimate of the effect that conflict has on food security. The table below does shows some widely diverging values, probably due to the sample size being too small.


Percentage difference in food security scores
category hoh_education %_difference
rural_farmers edu_secondary 63.82
urban_workers edu_primary 30.41
urban_workers edu_secondary 8.87
urban_workers edu_higher 8.65
rural_farmers edu_higher 6.88
rural_farmers edu_none 6.77
urban_workers edu_none 6.57
rural_farmers edu_primary -9.97




2. Distribution of conflict events in Myanmar

Approximately 6% of all the households surveyed by FAO-WFP were directly affected by conflict, violence and insecurity. This discounts households that have been affected by the secondary impacts of conflict, such as loss of access to markets and increased food prices. Whilst there is no set threshold whereby one can state that everyone in a given area has been affected by conflict, it is possible to determine where the conflict has been the most severe.

Similar to how the basic criteria beneficiary selection at the household level was described in the section above, this section will focus on how to prioritise amongst the various geographic areas in Myanmar. For a more comprehensive review of conflict in Myanmar, please refer to the Food Security Cluster’s Report on Conflict Dynamics in Myanmar.



2.1 Conflict events and fatalities by state/region


Sagaing saw the highest number of conflict events as well as conflict as well as conflict-related fatalities in 2012. It experienced more than three times as many conflict-related fatalities than the next-highest state/region – Magway. This is a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.

Kayah, Chin and Sagaing had the highest number of conflict fatalities per capita in 2021.




2.2 Conflict score by township

As can be seem from the barplots in the previous section, the distribution of conflict events and fatalities is not even, being skewed to a few states/regions. This is also evident at township level. In the scatterplot below, the averages of the number of conflict events and the number of fatalities at the township level have been marked by the dotted red lines, dividing the plot into four quadrants.

A requisite for any prioritisation score or index develop should be target, first and foremost, the townships in the upper right quadrant of the plot, which have the heaviest concentrations of conflict events and fatalities. These areas are where, as we have established in the section on beneficiary selection, where the highest concentrations of households in the priority group will be found. For reference, 58 townships have both above-average numbers of conflict events and fatalities (upper-right quadrant) and 196 townships have both below-average numbers of conflict events and fatalities (bottom-left quadrant).



At its most basic, the conflict score is just the average of battles, explosions, remote violence, violence against civilians, strategic developments, non-peaceful protests and riots and conflict-related fatalities. More details can be found in the FSC’s notes on updating the MIMU-HARP Conflict Index. This score will be now be used as a shorthand for conflict incidence in Myanmar.

It is additionally recognised that different types of townships necessitate different programming options. And, as established in the first section, rural and urban areas have widely differing numbers of households in the priority group. Therefore, townships hace also split into four simple groups (A1, A2, B1 and B2) based on their conflict score and population density.

This grouping separates all 330 townships along two criteria – high (A) or low (B) conflict score and high (1) or low (2) population density. Groups A1 and A2 have above average conflict scores. These 107 townships should be prioritised for humanitarian interventions. Recalling the scatterplot above, the colours have now been updated to reflect the prioritisation group. From the plot below that whilst group A1 have populations that are easier to access (having higher population density), the incidence of conflict is higher overall in group A2, with the numbers of conflict-related fatalities being much higher. This quick-and-dirty prioritisation has managed to exclude almost all the townships in bottom-left quadrant (least conflict-affected) from groups A1 and A2.



Groups A1 and A2 can be distinguished by their population density, with the average population density in group A1 being more than 100 times higher than in group A2. The average PIN per township is slightly higher in group A1 than in group A2. The scatterplot below shows townships by the number of people in need (x-axis) and the population density (y-axis), with the colours reflecting which group each belongs to:



The table below provides some summary statistics for each of the four groups. Included are the PIN and population targeted within the townships in each group, the average conflict score (higher conflict scores indicate a higher incidence of conflict), the average population density and the number of townships within each group:


Summary statistics by township group
group PIN target conflict_score ppl_per_km2 townships
A1 1,664,942 1,428,534 0.172 14,092 25
A2 3,839,987 666,531 0.198 108 82
B1 620,459 544,866 0.033 15,189 20
B2 7,097,081 1,460,071 0.021 107 203
Note: Groups A1 and A2 have above average conflict scores; groups A1 and B1 have the above average population densities. Townships in groups A1 and A2 should be prioritised over the others.



2.3 Linking geographic prioritisation and beneficiary selection

Using the classifications from the simple decision tree in section 1.3, we can see that in rural areas, the highest proportions of people who are in the priority group are those who have been affected by conflict, followed by those who were affected by conflict and have lost work or employment opportunities. Rural areas severely-affected by conflict (the townships in group A2) are the areas in which we may reach populations with the highest proportions of households in the priority group.


Where are the highest proportions of persons in priority groups?
Rural Shocks_Conflict Shocks_Lost_Work %_Priority
no no yes 42.13
yes no yes 42.21
yes yes no 65.95
yes yes yes 61.27
Data sources: ACLED; acleddata.com and FAO-WFP


In urban areas, however, conflict incidence is not as important of a determining factor – the best results can be achieved by targeting people who have lost work or employment opportunities, irrespective of whether or not they have been affected by conflict.


Which areas have less people in the priority group?
Rural Shocks_Conflict Shocks_Lost_Work %_Priority
no no no 18.47
no yes no 22.36
no yes yes 25.34
yes no no 34.51
Data sources: ACLED; acleddata.com and FAO-WFP



2.4 Maps of conflict scores and prioritisation group



2.5 Reference table for conflict variables

Below is an interactive reference table for the various types of conflict events by township. It also includes the overall conflict score and prioritisation groups. The search bar can be used to find specific townships, or any of the columns may be sorted according to ascending or descending values. The table currently shows townships in descending order of conflict score.





3. Distribution of flood risk in Myanmar

3.1 Historical flood data

In light of the impending monsoon season, the probability that a township will be affected by a major flood or cylconic event has been calculated. Major floods since 2008 have been factored into this calculation.

For the moment, conflict incidence and flood and cyclone risk will be evaluated separately. Flood and storm surge risk exist as probabilities for the moment and are intended to support prepositioning and Disaster Risk Reduction; this might change were severe flooding to occur in 2022.



Based on this data, a score was calculated for each township based on how many times it had been affected by floods since 2008. The table below also summarises the number of people in need (2022). 2,210,725 people live in townships that have flooded more than 5 times since 2008.

Summary statistics by number of floods (2008-2021)
flood_count townships people_in_need
9 1 55,490
8 4 333,874
7 7 292,124
6 15 565,632
5 23 963,605
4 33 1,769,108
3 54 2,735,536
2 70 2,994,977
1 73 2,213,089
0 50 1,299,033
Data source: MIMU and UNDP



3.2 Map of flood risk

The map below shows the probability of each township being affected by floods. The areas with the greatest risk of flooding are in Mon, near the mouth of the Sittaung River and the Gulf of Mottama and those along the Ayeyarwady River, and to a lesser extent, along the Chindwin River.




3.3 Reference table for flood risk

Below is an interactive reference table for flood risk by township. It includes the number of times since 2008 a township has been affected by flooding (flood_count) and the probability of flooding (flood_risk). Similar to the interactive table in the previous chapter, the search bar can be used to find specific townships and any of the columns may be sorted according to ascending or descending values. The table currently shows townships sorted in descending order of flood risk.





4. Technical notes

These annexes contain additional technical information that informed the decisions in the earlier sections.

4.1 Limitations of the FAO-WFP survey

The most important limitation of the FAO-WFP survey was the exclusion of several key states and regions from the survey. Of particular interest are Sagaing, Magway and Mandalay where the conflict has been particularly intense. Chin state has also been marked as “false” below since only 7 respondents were interviewed in the entire state.

Furthermore, the dry zone was not surveyed. From an agricultural perspective, this is a major omission as the diversity of crops and, consequently, diets are much higher in the dry zone than in the other parts of the country, which are predominantly focused on paddy.

In spite of these major limitations and the numerous assumptions that have had to made, the FAO-WFP survey is most comprehensive dataset on food security that has been collected. Additional efforts will be made to cross-reference these data from those of other surveys. These models will be updated once the third round of the FAO-WFP survey is ready. As a final point in this section, the FAO-WFP survey, in spite of its limitations forms the basis of the People in Need calculations.



4.2 Linear regression model

Prior to the development of the decision tree detailed in section 1.3, a linear regression model had been considered. However, no matter how sophisticated the method, the highest r-squared achieved was 0.13. With reference to the plot below of predicted and actual values of the food security score (of the best performing model), whilst there is a significant relationship, its predictive performance is too weak.



The relatively low r-squared is likely due to missing variables in the FAO-WFP survey. For instance, the factors that go into a household’s decision to reduce their healthcare expenditures are too multifarious to be captured by a survey on food security.

This pattern was also true for the overall food security score as well as the individual food security indices (Food Consumption Score, Food Insecurity Experience Scale and Coping Strategies Index).

For additional reference, the table below shows the top 15 variables ranked by the percentage of variance of the food security score that they explain.


Variables ranked by percent of variance
term pc_variance
Residuals 86.34
shocks_none 4.14
income_ms_stable_non_ag 2.42
rural 2.03
shocks_lostwork 0.88
income_ms_selfem_nonwork 0.71
not_improved_sanitation 0.55
age_18_40 0.48
income_ms_agriculture 0.45
shocks_conflict 0.44
income_ms_livestock 0.35
shocks_naturalhazard 0.34
shocks_pricesother 0.33
age_41_65 0.12
shocks_accessmarket 0.12



4.3 Pairwise correlations of indicators in the FAO-WFP survey

The table below shows the top 20 correlations between the different variables collected by the FAO-WFP food security survey. When a particular variable is of interest, it may be useful and interesting to see which other variables it is most correlated with.

The vast majority of the variables, with the exception of composite scores and indices, are binary, with 1 being true and 0 being false. In these cases, a correlation of 1 would mean that a variable is true for all the households in which its match is also true; a correlation of 0.5 means that a variable is true for 50% of the households in which its match is true.

For instance, whether or not the head of the household has competed education (edu_higher) is most correlated with households whose main income source is stable non-agricultural income (income_ms_stable_non_ag). However, it should be noted that the components of the food security indices tended to only be correlated with each other, again indicating that the environmental and demographic variables collected are not sufficient to explain the variance in food security.




4.4 Calculating the conflict score

Using ACLED data, a conflict score was calculated at township level. The conflict score here is an update of the conflict index in the MIMU-HARP Vulnerability Analysis, using 2021 data. The specific conflict variables that included in the score were battles, explosions and remote violence, non-peaceful protests and riots, conflict-related fatalities and strategic developments.

A conflict score, at its most basic, is an average of the normalised values of key conflict indicators. Its main use it to aid decisions about geographic prioritisation. These normalised values have been re-weighted with Betti-Verma method, which penalises redundancy and rewards variation; this is the only notable divergence from the MIMU-HARP methodology. The Betti-Verma method was employed through the mdepriv package developed by Attilio and Aldo Benini. The specific formula used in the development of the score can found by downloading the code at the top-right corner of the page.

LS0tDQp0aXRsZTogIk5vdGVzIG9uIFByZWxpbWluYXJ5IFRvd25zaGlwIFByaW9yaXRpc2F0aW9uIg0KYXV0aG9yOiAiTXlhbm1hciBGb29kIFNlY3VyaXR5IENsdXN0ZXIiDQpkYXRlOiAiMjUvMDMvMjAyMiINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBjb2xsYXBzZWQ6IGZhbHNlDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZSAgIA0KLS0tDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQoNCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICIiOw0KICBkaXNwbGF5OiBibG9jazsNCiAgaGVpZ2h0OiA3MHB4Ow0KICBtYXJnaW46IDJlbSAyMHB4IDQwcHggMjBweDsNCiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJNeWFubWFyX2NsdXN0ZXJfYmx1ZS5wbmciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShoYXZlbikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShwYW5kZXIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShzMikNCmxpYnJhcnkoYm9va2Rvd24pDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KG1kZXByaXYpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeSh3aWR5cikNCmxpYnJhcnkocnBhcnQpDQpsaWJyYXJ5KHJwYXJ0LnV0aWxzKQ0KbGlicmFyeShyYXR0bGUpDQpsaWJyYXJ5KGJyb29tc3RpY2spDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHBsb3RseSkNCg0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KIyByZXBsYWNlIA0Kb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCnN1bV9iZW4gPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIpew0KICANCiAgY29sdW1uX3ZhciA8LSBlbnF1byhjb2x1bW5fdmFyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCiAgICANCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMsIDIgZ3JvdXBlZCB2YXJpYWJsZXMNCnN1bV9iZW4yIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyMSwgY29sdW1uX3ZhcjIpew0KICANCiAgY29sdW1uX3ZhcjEgPC0gZW5xdW8oY29sdW1uX3ZhcjEpDQogIGNvbHVtbl92YXIyIDwtIGVucXVvKGNvbHVtbl92YXIyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyMSwgISFjb2x1bW5fdmFyMikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgc2NhbGluZyBmdW5jdGlvbnMgDQpyYW5nZTAxIDwtIGZ1bmN0aW9uKHgpeyh4LW1pbih4KSkvKG1heCh4KS1taW4oeCkpfQ0KcmFuZ2Vfd25hIDwtIGZ1bmN0aW9uKHgpeyh4LW1pbih4LCBuYS5ybSA9IFRSVUUpKS8obWF4KHgsIG5hLnJtID0gVFJVRSktbWluKHgsIG5hLnJtID0gVFJVRSkpfQ0KDQojbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQoNCiMgcmVhZGluZyBpbiBQSU4NCnBpbiA8LSByZWFkX2V4Y2VsKCJocGNfcGluLnhsc3giKQ0KDQojIHJlYWRpbmcgaW4gdG93bnNoaXBzIGZyb20gZ2VvYWRtaW5zIA0KdG93bnNoaXBzIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL3NlYW55L0Rvd25sb2Fkcy9SL21tcl81d19pbml0aWFsX29ic2VydmF0aW9ucy9GU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KGFkbWluMXBjb2RlXzQ6YWRtaW4zcGNvZGUpICU+JSANCiAgcmVuYW1lKGFkbWluMV9wY29kZSA9IGFkbWluMXBjb2RlXzQsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjNwY29kZSwNCiAgICAgICAgIHN0YXRlX25hbWUgICA9IHN0YXRlXzUsDQogICAgICAgICB0b3duc2hpcF9uYW1lICA9IGNvdW50eSkgJT4lIA0KICByZW1vdmVfZW1wdHkoKSAlPiUgDQogIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RhdGVfbmFtZSA9PSAiTWFnd2F5IiAmIHRvd25zaGlwX25hbWUgPT0gIk1pbmhsYSIsICJNTVIwMDkwMTMiLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0YXRlX25hbWUgPT0gIllhbmdvbiIgJiB0b3duc2hpcF9uYW1lID09ICJIdGFudGFiaW4iLCAiTU1SMDEzMDA2IiwgYWRtaW4zX3Bjb2RlKSkNCg0KcGNvZGVzIDwtIHJlYWRfZXhjZWwoIk15YW5tYXIgUENvZGVzIFJlbGVhc2VfOS4zX0phbjIwMjFfKFN0UmduX0Rpc3RfVHNwX1Rvd25fV2FyZF9WVCkueGxzeCIsDQogICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIwM19Ub3duc2hpcCIpIA0KDQojIHNoYXBlZmlsZXMNCnBjb2RlM19zaGFwZSA8LSBzdF9yZWFkKCJDOi9Vc2Vycy9zZWFueS9Eb3dubG9hZHMvUi9hY2xlZC9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgIGFkbWluM19wY29kZSA9IFRTX1BDT0RFKSAlPiUgDQogbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRvd25zaGlwLCAiSGxhaW5ndGhhcnlhIiksICJNTVIwMTMwMDgiLCBhZG1pbjNfcGNvZGUpKQ0KDQpwY29kZTFfc2hhcGUgPC0gc3RfcmVhZCgiQzovVXNlcnMvc2VhbnkvRG93bmxvYWRzL1IvYWNsZWQvbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKSAlPiUgc3RfYXNfc2YoKQ0KDQojIHJlYWRpbmcgaW4gNVdzDQpmc2MgPC0gcmVhZF9jc3YoIkM6L1VzZXJzL3NlYW55L0Rvd25sb2Fkcy9SL2FjbGVkL2ZzYzV3XzIwMjEuY3N2IikNCg0KIyByZWFkaW5nIGluIHZ1bG5lcmFiaWxpdHkgZGF0YXNldA0KdnVsbW1yIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL3NlYW55L0Rvd25sb2Fkcy9SL21tcl81d19pbml0aWFsX29ic2VydmF0aW9ucy9EYXRhc2V0c19WdWxuZXJhYmlsaXR5X0FuYWx5c2lzX2luX015YW5tYXJfMDlKdWwyMDE4ICgxKS54bHN4IiwNCiAgICAgICAgICAgc2tpcCA9IDEpICU+JSANCiAgc2xpY2UoLWMoMTozKSkgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KC1sYWJlbCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhudW1iZXJfb2ZfdmlsbGFnZV90cmFjdHM6d2Jfd2VhbHRoX3JhbmspLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGRpc2FzdGVyc19pbXBhY3RlZF9ieV9uYXJnaXNfMjAwODphY2xlZF8yMDE1XzIwMTZfZGF0YV9leGlzdHMpLCBhcy5sb2dpY2FsKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNvbmZsaWN0XzIwMTVfMjAxNl9udW1iZXJfb2ZfYmF0dGxlczpjb3JyZWN0ZWRfY29uZmxpY3RfaW5kZXhfZ2FycnkpLCBhcy5udW1lcmljKSAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoIngiKSkgJT4lIA0KICBzZWxlY3QoLWMocHJpdmF0ZV9zZWN0b3JfZGV2ZWxvcG1lbnRfMjAxNF8yMDE1LCBwcm90ZWN0aW9uXzIwMTBfMjAxNSwgc2hlbHRlcl8yMDEwXzIwMTUsIHdhc2hfMjAxMF8yMDE1KSkNCg0KIyByZWFkaW5nIGluIGNvbmZsaWN0IHNjb3JlDQpjb25mbGljdF9zY29yZSA8LSByZWFkX2NzdigiY29uZmxpY3Rfc2NvcmUuY3N2IikNCg0KIyBzaG93X2NvbCh2aXJpZGlzX3BhbCgpKDEwKSkNCg0KZmxvb2RzX3N0b3JtX3N1cmdlIDwtIHJlYWRfZXhjZWwoIkZsb29kX0FmZmVjdGVkX1Rvd25zaGlwXygyMDA4LTIwMjEpICgxKS54bHN4IikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gc3QsIHRvd25zaGlwID0gdHMsIGFkbWluMV9wY29kZSA9IHN0X3Bjb2RlLCBhZG1pbjNfcGNvZGUgPSB0c19wY29kZSkgJT4lIA0KICBtdXRhdGUoeWVhcl8yMDA4X3N0b3JtX3N1cmdlID0gaWZlbHNlKCFpcy5uYShzdG9ybV9zdXJnKSwgMSwgMCkpICU+JQ0KICBtdXRhdGUoeWVhcl8yMDA4ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMDgiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMDkgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAwOSIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxMCA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDEwIiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDExID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTEiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTIgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxMiIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxMyA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDEzIiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDE0ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTQiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTUgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxNSIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxNiA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDE2IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDE3ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTciKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTggPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxOCIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxOSA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDE5IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDIwID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMjAiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMjEgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAyMSIpLCAxLCAwKSkgJT4lDQogIHJlbmFtZShmbG9vZHllYXJzID0gZmxvb2RfeWVhcikgJT4lIA0KICBtdXRhdGUoDQogICAgZmxvb2RfcHJvYiA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgieWVhcl8iKSkgJT4lIHJvd01lYW5zKG5hLnJtID0gVFJVRSksDQogICAgZmxvb2RfY291bnQgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoInllYXJfIikpICU+JSByb3dTdW1zKG5hLnJtID0gVFJVRSkpDQoNCiMgbWFpbiBkYXRhc2V0IGZvciB0aGlzIG5vdGUNCmZzX3BpbiA8LSBwaW4gJT4lIA0KICBsZWZ0X2pvaW4oY29uZmxpY3Rfc2NvcmUgJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUsIGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCBwcm90ZXN0c19hbmRfcmlvdHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgY29uZmxpY3Rfc2NvcmUgPSBzY29yZV9pLCBmYXRhbGl0aWVzKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHZ1bG1tciAlPiUgc2VsZWN0KGFkbWluM19wY29kZSA9IHRvd25zaGlwX3Bjb2RlLCANCiAgICAgICAgICAgICAgICAgICAgIGFyZWFfc293bl9hY3JlcyA9IGFsbF9hcmVhX3Nvd2VkX21hbGksIHBvcHVsYXRpb25fZGVuc2l0eSksDQogICAgICAgICAgICBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmbG9vZHNfc3Rvcm1fc3VyZ2UgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBmbG9vZF9wcm9iLCBmbG9vZF9jb3VudCksDQogICAgICAgICAgICBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lDQogICAgICAgICAgICAgIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzXzIwMjEgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyc18yMDIxID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgZmlsdGVyKGRhdGUgPiAiMjAyMS0wOS0wMSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuXzZfbW9udGhzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKG5vdF9pbl82bW9udGhzID0gaWZlbHNlKGlzLm5hKGJlbl82X21vbnRocyksIDEsIDApKSAlPiUgDQogIG11dGF0ZShmc19waW4gPSBpZmVsc2UoZnNfcGluID4gcG9wdWxhdGlvbl8yMDIxX3Byb2osIHBvcHVsYXRpb25fMjAyMV9wcm9qLCBmc19waW4pKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChjb25mbGljdF9zY29yZSA9IDAsIGJlbmVmaWNpYXJpZXNfMjAyMSA9IDAsIHBhcnRuZXJzXzIwMjEgPSAwLCBmbG9vZF9wcm9iID0gMCkpICU+JSANCiAgbXV0YXRlKGNvbmZsaWN0X3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoY29uZmxpY3Rfc2NvcmUpKSwNCiAgICAgICAgIGZsb29kX3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoZmxvb2RfcHJvYikpLA0KICAgICAgICAgZnNfcGluX3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoZnNfcGluKSksDQogICAgICAgICBmc190YXJnZXRfcmFua2luZyA9IGRlbnNlX3JhbmsoZGVzYyhmc190YXJnZXRlZCkpLA0KICAgICAgICAgZnNfcGluX3BjID0gZnNfcGluIC8gc3VtKGZzX3BpbiksDQogICAgICAgICBwaW5fcG9wID0gZnNfcGluIC8gcG9wdWxhdGlvbl8yMDIxX3Byb2opICU+JSANCiAgbXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGNvbmZsaWN0X3Njb3JlID49IG1lYW4oY29uZmxpY3Rfc2NvcmUpICYgcG9wdWxhdGlvbl9kZW5zaXR5ID49IDUwMCB+ICJBMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9zY29yZSA+PSBtZWFuKGNvbmZsaWN0X3Njb3JlKSAmIHBvcHVsYXRpb25fZGVuc2l0eSA8IDUwMCB+ICJBMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9zY29yZSA8IG1lYW4oY29uZmxpY3Rfc2NvcmUpICYgcG9wdWxhdGlvbl9kZW5zaXR5ID49IDUwMCB+ICJCMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9zY29yZSA8IG1lYW4oY29uZmxpY3Rfc2NvcmUpICYgcG9wdWxhdGlvbl9kZW5zaXR5IDwgNTAwIH4gIkIyIikpIA0KDQojIHNob3VsZCBpIGp1c3QgcmVhZCBpbiB0aGUgd2hvbGUgc3VydmV5IGRhdGFzZXQgaGVyZT8gb3IganVzdCByZWFkIGluIHRoZSBjc3YNCiMgaSBkb24ndCByZWFsbHkga25vdyBpZiBwZW9wbGUgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGNsZWFuaW5nIHByb2Nlc3MNCg0KZmFvX3N1cnZleSA8LSByZWFkX2R0YSgiTU1SX1IySFFfY2xlYW5lZFd0X2ZpbmFsLmR0YSIpICU+JSANCiAgemFwX2xhYmVscygpDQoNCnN1cnZleSA8LSBmYW9fc3VydmV5ICU+JSANCiAgcmVuYW1lKGFkbWluM19wY29kZSA9IGFkbTNfcGNvZGUpICU+JSANCiAgbGVmdF9qb2luKHBjb2RlcyAlPiUgc2VsZWN0KGFkbWluM19wY29kZSA9IFRzcF9QY29kZSwgdG93bnNoaXAgPSBgVG93bnNoaXBfTmFtZV9FbmdgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjJfcGNvZGUgPSBgRGlzdHJpY3QvU0FaX1Bjb2RlYCwgYWRtaW4yID0gYERpc3RyaWN0L1NBWl9OYW1lX0VuZ2AsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYFNSX05hbWVfRW5nYCwgYWRtaW4xX3Bjb2RlID0gU1JfUGNvZGUpLA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjc19zdHJlc3NfaGhfYXNzZXRzOmNzX2VtZXJnZW5jeV9oaF9yaXNrKSwgDQogICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gNCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gLikpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY3Nfc3RyZXNzX2hoX2Fzc2V0czpjc19lbWVyZ2VuY3lfaGhfcmlzayksIA0KICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDEgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAuID09IDIgfiAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgLiA9PSAxIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lDQogIG11dGF0ZShsaGNzaV9tYXggPSBjYXNlX3doZW4obGhjc2lfbWF4X2FnID09ICJOb25lIiB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhjc2lfbWF4X2FnID09ICJTdHJlc3MiIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaGNzaV9tYXhfYWcgPT0gIkNyaXNpcyIgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoY3NpX21heF9hZyA9PSAiRW1lcmdlbmN5IiB+IDMpLA0KICAgICAgICAgICAgICAgICAgbGhjc2lfcmFuZ2UgPSByYW5nZTAxKGxoY3NpX21heCkpICU+JQ0KICBtdXRhdGUoY3NpX3dlaWdodGVkID0gKGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzICsgY3NfY3Jpc2lzX25vX3NjaG9vbCArIGNzX2NyaXNpc19yZWR1Y2VkX2hlYWx0aF9leHApICogMC41ICsgDQogICAgICAgICAgIChjc19lbWVyZ2VuY3lfc29sZF9ob3VzZSArIGNzX2VtZXJnZW5jeV9oaF9taWdyYXRpb24gKyBjc19lbWVyZ2VuY3lfaGhfcmlzaykgKiAxLA0KICAgICAgICAgY3NpX3dlaWdodGVkID0gcmFuZ2Vfd25hKGNzaV93ZWlnaHRlZCkpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoaGhfZ2VuZGVyLCBmZXdmb29kLCBza2lwcGVkLCB3aGxkYXksIGh1bmdyeSwgYXRlbGVzcywgaGVhbHRoeSwgcnVub3V0LCB3b3JyaWVkLCANCiAgICAgICAgICAgICAgICAgY3JwX3NhbGVzZGlmLCBhY2Nlc3NtYXJrZXQsIG5lZWQsIGNycF9wcm9kZGlmLCBjcm9wZGlmZmljdWx0eXVucmVzdCwgY3JvcHNhbGVzZGlmZmljdWx0eXVucmVzdCksIA0KICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDMgfiBOQV9yZWFsXywgDQogICAgICAgICAgICAgICAgICAgICAgIC4gPT0gNCB+IE5BX3JlYWxfLCANCiAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IC4pKSAlPiUgDQogIG11dGF0ZShob2hfZmVtYWxlID0gY2FzZV93aGVuKGhoX2dlbmRlciA9PSAxIH4gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2dlbmRlciA9PSAyIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGhoX2dlbmRlcikpICU+JQ0KICBtdXRhdGVfYXQodmFycyhmaWVzX2Zld2Zvb2QgPSBmZXdmb29kLCBmaWVzX3NraXBwZWQgPSBza2lwcGVkLCANCiAgICAgICAgICAgICAgICAgZmllc193aGxkYXkgPSB3aGxkYXksIGZpZXNfaHVuZ3J5ID0gaHVuZ3J5LA0KICAgICAgICAgICAgICAgICBmaWVzX2F0ZWxlc3MgPSBhdGVsZXNzLCBmaWVzX2hlYWx0aHkgPSBoZWFsdGh5LA0KICAgICAgICAgICAgICAgICBmaWVzX3J1bm91dCA9IHJ1bm91dCwgZmllc193b3JyaWVkID0gd29ycmllZCwNCiAgICAgICAgICAgICAgICAgYWNjZXNzbWFya2V0LCBuZWVkLCBjcnBfc2FsZXNkaWYsIGNycF9wcm9kZGlmLA0KICAgICAgICAgICAgICAgICBjcm9wZGlmZmljdWx0eXVucmVzdCwgY3JvcHNhbGVzZGlmZmljdWx0eXVucmVzdCksDQogICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gMSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAuID09IDIgfiAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUNCiAgbXV0YXRlKG5vX2FjY2Vzc21hcmtldCA9IGlmZWxzZShhY2Nlc3NtYXJrZXQgPT0gMSwgMCwgMSkpICU+JSANCiAgIyBiZSBjYXJlZnVsIGhlcmUgLS0geW91J3ZlIGltcHV0ZWQgbWlzc2luZyBmaWVzIGRhdGEgYXMgMA0KICAjIHRoaXMgaXMgdGhlIGZpZXMgcmF3IHNjb3JlLCBub3Qgc3VyZSBpZiBpIG5lZWQgYW55IGFkZGl0aW9uYWwgdHJhbnNmb3JtYXRpb25zIGF0IHRoZSBoaGQgbGV2ZWwNCiAgbXV0YXRlKGZpZXNfcmF3ID0gZmllc19mZXdmb29kICsgZmllc19za2lwcGVkICsgZmllc193aGxkYXkgKyBmaWVzX2h1bmdyeSArDQogICAgICAgICAgIGZpZXNfYXRlbGVzcyArIGZpZXNfaGVhbHRoeSArIGZpZXNfcnVub3V0ICsgZmllc193b3JyaWVkLCANCiAgICAgICAgIGZpZXNfcmF3X3JhbmdlID0gcmFuZ2Vfd25hKGZpZXNfcmF3KSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhoaF93ZWFsdGhfdG9pbGV0LCBoaF9yZXNpZGVuY2V0eXBlLCBoaF9lZHVjYXRpb24sDQogICAgICAgICAgICAgICAgIGluY29tZV9tYWluX2NvbXAsIGluY29tZV9zZWNfY29tcCwgaW5jb21lX3RoaXJkX2NvbXAsIA0KICAgICAgICAgICAgICAgICBjcnBfYXJlYV9jaGFuZ2UsIGNycF9oYXJ2X2NoYW5nZSwgY3JwX3NhbGVzcHJpY2UpLA0KICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDYgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgLiA9PSA3IH4gTkFfcmVhbF8sIA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gLikpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoaW5jb21lX21haW5fY29tcCwgaW5jb21lX3NlY19jb21wLCBpbmNvbWVfdGhpcmRfY29tcCwgDQogICAgICAgICAgICAgICAgIGNycF9hcmVhX2NoYW5nZSwgY3JwX2hhcnZfY2hhbmdlLCBjcnBfc2FsZXNwcmljZSksDQogICAgICAgICAgICB+cmFuZ2Vfd25hKC4pKSAlPiUgICANCiAgbXV0YXRlKG5vdF9pbXByb3ZlZF9zYW5pdGF0aW9uID0gY2FzZV93aGVuKGhoX3dlYWx0aF90b2lsZXQgPT0gMSB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfd2VhbHRoX3RvaWxldCA9PSAyIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF93ZWFsdGhfdG9pbGV0ID09IDMgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3dlYWx0aF90b2lsZXQgPT0gNCB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfd2VhbHRoX3RvaWxldCA9PSA1IH4gMSkpICU+JSANCiAgbXV0YXRlKHJlc2lkZW5jZV90eXBlID0gY2FzZV93aGVuKGhoX3Jlc2lkZW5jZXR5cGUgPT0gMSB+ICJyZXNpZGVuY2VfcGVybWFuZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3Jlc2lkZW5jZXR5cGUgPT0gMiB+ICJyZXNpZGVuY2VfcmVjZW50X21pZ3JhbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfcmVzaWRlbmNldHlwZSA9PSAzIH4gInJlc2lkZW5jZV9yZXR1cm5lZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9yZXNpZGVuY2V0eXBlID09IDQgfiAicmVzaWRlbmNlX2lkcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9yZXNpZGVuY2V0eXBlID09IDUgfiAicmVzaWRlbmNlX3JlZnVnZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSkgJT4lIA0KICBtdXRhdGUoaG9oX2VkdWNhdGlvbiA9IGNhc2Vfd2hlbihoaF9lZHVjYXRpb24gPT0gMSB+ICJlZHVfbm9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2VkdWNhdGlvbiA9PSAyIH4gImVkdV9wcmltYXJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfZWR1Y2F0aW9uID09IDMgfiAiZWR1X3NlY29uZGFyeSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2VkdWNhdGlvbiA9PSA0IH4gImVkdV9oaWdoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9lZHVjYXRpb24gPT0gNSB+ICJlZHVfcmVsaWdpb3VzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaGhfYWdlLCBpbmNvbWVjaGFuZ2VyZWR1Y2VkLCB3aGVyZW1pZ3JhdGlvbiwgbWVhbHMsIGhoX2FncmljYWN0aXZpdHkpLA0KICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDUgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgLiA9PSA2IH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAuKSkgJT4lIA0KICBtdXRhdGUoaG9oX2FnZSA9IGNhc2Vfd2hlbihoaF9hZ2UgPT0gMSB+ICJhZ2VfdW5kZXIxOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2FnZSA9PSAyIH4gImFnZV8xOF80MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2FnZSA9PSAzIH4gImFnZV80MV82NSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2FnZSA9PSA0IH4gImFnZV9vdmVyNjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXykpICU+JSANCiAgICBtdXRhdGUobWVhbHNfaW52ID0gY2FzZV93aGVuKG1lYWxzID09IDQgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFscyA9PSAzIH4gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFscyA9PSAyIH4gMywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbHMgPT0gMSB+IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IG1lYWxzKSwNCiAgICAgICAgIG1lYWxzX2ludiA9IHJhbmdlX3duYShtZWFsc19pbnYpKSAlPiUgDQogIG11dGF0ZShpbmNvbWVfcmVkdWNlZCA9IGNhc2Vfd2hlbihpbmNvbWVjaGFuZ2VyZWR1Y2VkID09IDQgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lY2hhbmdlcmVkdWNlZCA9PSAzIH4gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZWNoYW5nZXJlZHVjZWQgPT0gMiB+IDMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lY2hhbmdlcmVkdWNlZCA9PSAxIH4gNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBpbmNvbWVjaGFuZ2VyZWR1Y2VkKSwNCiAgICAgICAgIGluY29tZV9yZWR1Y2VkID0gcmFuZ2Vfd25hKGluY29tZV9yZWR1Y2VkKSkgJT4lIA0KICAjIHlvdSd2ZSBjaGFuZ2VkIGFsbCB0aGUgTkFzIGluIGFncmlhY3Rpdml0eSB0byAwDQogIG11dGF0ZShhZ3JpX2FjdGl2aXR5ID0gY2FzZV93aGVuKGhoX2FncmljYWN0aXZpdHkgJWluJSBjKDEsIDIsIDMpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JQ0KICAjIGZpZXMgaW5kaWNhdG9ycyAgICAgDQogIG11dGF0ZV9hdCh2YXJzKGZpZXNfcmFub3V0X2hocywgZmllc19odW5ncnlfaGhzLCBmaWVzX3dobGRheV9oaHMpLA0KICAgICAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSA0IH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAuID09IDUgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAuKSkgJT4lIA0KICAgICAgbXV0YXRlX2F0KHZhcnMoZmllc19odW5ncnlfaGhzLCBmaWVzX3Jhbm91dF9oaHMsIGZpZXNfd2hsZGF5X2hocyksDQogICAgICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDMgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gPT0gMiB+IDAuNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAuID09IDEgfiAwLjI1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAuKSkgJT4lDQogIG11dGF0ZShleHBlbnNlZm9vZDMwZCA9IGNhc2Vfd2hlbihleHBlbnNlZm9vZDMwZCA9PSAxMSB+IE5BX3JlYWxfLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlbnNlZm9vZDMwZCA9PSAxMiB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBleHBlbnNlZm9vZDMwZCkpICU+JSANCiAgICAgIG11dGF0ZShleHBlbnNlX2Zvb2QgPSBleHBlbnNlZm9vZDMwZCAvIDEwKSAlPiUNCiAgICAgICMgZmNzIGluZGljYXRvcnMNCiAgbXV0YXRlKGhoZmNzX2ludiA9IDExMiAtIEhIRkNTLA0KICAgICAgICAgaGhmY3NfaW52ID0gcmFuZ2Vfd25hKGhoZmNzX2ludiksDQogICAgICAgICBmY3NfYm9yZGVybGluZV9wb29yID0gaWZlbHNlKEhIRkNTIDw9IDM1LCAxLCAwKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGZjc3N0YXAsIGZjc3B1bHNlLCBmY3NkYWlyeSwgZmNzcHIsIGZjc3ZlZywgZmNzZnJ1aXQsIGZjc2ZhdCwgZmNzc3VnYXIpLA0KICAgICAgICAgICAgICAgIH4gcmFuZ2Vfd25hKDcgLSAuKSkgJT4lDQogIHJlbmFtZV93aXRoKHN0cl9yZXBsYWNlLCBwYXR0ZXJuID0gImZjcyIsIHJlcGxhY2VtZW50ID0gImZjc18iLCBtYXRjaGVzKCJmY3MiKSkgJT4lICANCiAgcmVuYW1lKGZjc19wcm90ZWluID0gZmNzX3ByLCBmY3Nfc3RhcGxlID0gZmNzX3N0YXAsIGhoZmNzX2ludiA9IGhoZmNzX19pbnYpICU+JSANCiAgbXV0YXRlKGluY29tZV9zb3VyY2UgPSBjYXNlX3doZW4oaW5jb21lX21haW4gJWluJSBjKDEsIDIsIDMsIDcsIDgsIDksIDEwKSB+ICJpbmNvbWVfbXNfYWdyaWN1bHR1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA0IH4gImluY29tZV9tc19saXZlc3RvY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA1IH4gImluY29tZV9tc19maXNoZXJpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTEsIDEzLCAxNCkgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoNiwgMTIpIH4gImluY29tZV9tc19jYXN1YWxfbm9uX2FnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX21haW4gJWluJSBjKDE1LCAxNiwgMTcsIDE4KSB+ICJpbmNvbWVfbXNfc2VsZmVtX25vbndvcmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTksIDIwKSB+ICJpbmNvbWVfbXNfbm9faW5jb21lIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciKSkgJT4lDQogIGxlZnRfam9pbihmYW9fc3VydmV5ICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGluY29tZV9zb3VyY2UgPSBjYXNlX3doZW4oaW5jb21lX21haW4gJWluJSBjKDEsIDIsIDMsIDcsIDgsIDksIDEwKSB+ICJpbmNvbWVfbXNfYWdyaWN1bHR1cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA0IH4gImluY29tZV9tc19saXZlc3RvY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiA9PSA1IH4gImluY29tZV9tc19maXNoZXJpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTEsIDEzLCAxNCkgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoNiwgMTIpIH4gImluY29tZV9tc19jYXN1YWxfbm9uX2FnIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX21haW4gJWluJSBjKDE1LCAxNiwgMTcsIDE4KSB+ICJpbmNvbWVfbXNfc2VsZmVtX25vbndvcmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTksIDIwKSB+ICJpbmNvbWVfbXNfbm9faW5jb21lIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiaW5jb21lX21zX3N0YWJsZV9ub25fYWciKSkgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChzdXJ2ZXlfaWQsIGluY29tZV9zb3VyY2UpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUodmFsdWUgPSAxKSAlPiUNCiAgICAgICAgICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGluY29tZV9zb3VyY2UsIHZhbHVlc19mcm9tID0gdmFsdWUsIHZhbHVlc19maWxsID0gMCksDQogICAgICAgICAgICBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogICAgICAjIGltcHV0ZWQgaW5jb21lX21haW5fZ3JvdXAgdmFsdWUgLS0gbG9vayBhdCB0aGUgIm1heWJlX2xhdGVyIiBiZWxvdyB0byBzZWUgaG93IGl0IHdhcyBkb25lDQogICAgICBtdXRhdGUocnVyYWwgPSBpZmVsc2UocnVyYWx1cmJhbiA9PSAxLCAxLCAwKSkgJT4lIA0KICAgICAgIyBpbXB1dGVkIGhvaCBzZXggLS0gbW9kZQ0KICAgICAgbXV0YXRlKGhvaF9mZW1hbGUgPSBpZmVsc2UoaXMubmEoaG9oX2ZlbWFsZSksIDAsIGhvaF9mZW1hbGUpKSAlPiUgDQogICAgICAjIGltcHV0ZWQgZmllc19yYW5vdXRfaGhzIC0tIG1vZGUNCiAgICAgIG11dGF0ZShmaWVzX3Jhbm91dF9oaHMgPSBpZmVsc2UoaXMubmEoZmllc19yYW5vdXRfaGhzKSwgMSwgZmllc19yYW5vdXRfaGhzKSkgJT4lICANCiAgbXV0YXRlKHNob2Nrc19ub25lID0gc2hvY2tfbm9zaG9jaywNCiAgICAgICAgIHNob2Nrc19sb3N0d29yayA9IHNob2NrX2xvc3RlbXBsb3J3b3JrLCANCiAgICAgICAgIHNob2Nrc19zaWNrbmVzc2RlYXRoID0gc2hvY2tfc2lja25lc3NvcmRlYXRob2ZoaCwgDQogICAgICAgICBzaG9ja3NfZm9vZHByaWNlcyA9IHNob2NrX2hpZ2hlcmZvb2RwcmljZXMsIA0KICAgICAgICAgc2hvY2tzX2NvbmZsaWN0ID0gc2hvY2tfdmlvbGVuY2VpbnNlY2NvbmYsIA0KICAgICAgICAgc2hvY2tzX2NhbnR3b3JrYnVzaW5lc3MgPSBzaG9ja19jYW50d29ya29yZG9idXNpbmVzcywgDQogICAgICAgICBzaG9ja3NfbmF0dXJhbGhhemFyZCA9IGlmZWxzZShzaG9ja19mbG9vZCA+IDAgfCBzaG9ja19kcm91Z2h0ID4gMCB8IHNob2NrX2h1cnJpY2FuZSA+IDAgfCBzaG9ja19sYW5kc2xpZGVzID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX2ZpcmVuYXR1cmFsID4gMCB8IHNob2NrX290aGVybmF0aGF6YXJkID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX2NvbGR0ZW1wb3JoYWlsID4gMCwgMSwgMCksDQogICAgICAgICBzaG9ja3NfYWNjZXNzbWFya2V0ID0gc2hvY2tfbmFwYXN0dXJlLCANCiAgICAgICAgIHNob2Nrc19wcmljZXNvdGhlciA9IGlmZWxzZShzaG9ja19oaWdoZXJhZ3JpbnB1dHByaWNlID4gMCB8IHNob2NrX2hpZ2hlcmZ1ZWxwcmljZXMgPiAwIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ja19vdGhlcmVjb25vbWljc2hvY2sgPiAwIHwgc2hvY2tfbG93b3V0cHV0cHJpY2UgPiAwLCAxLCAwKSwgDQogICAgICAgICBzaG9ja3Nfb3RoZXIgPSBpZmVsc2Uoc2hvY2tfb3RoZXJjcm9wYW5kbGl2ZXN0cyA+IDAgfCBzaG9ja19vdGhlcmludHJhaGhzaG9jayA+IDAgfCBzaG9ja19vdGhlcm1hbm1hZGVoYXphcmQgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX2FuaW1hbGRpc2Vhc2UgPiAwIHwgc2hvY2tfcGVzdG91dGJyZWFrID4gMCB8IHNob2NrX3BsYW50ZGlzZWFzZSA+IDAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX290aGVyY3JvcGFuZGxpdmVzdHMgPiAwIHwgc2hvY2tfb3RoZXJpbnRyYWhoc2hvY2sgPiAwIHwgc2hvY2tfdGhlZnRvZnByb2Rhc3NldHMgPiAwICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGluY29tZV9tYWluX2Ftb3VudCA9IDAsIGluY29tZV9zZWNfYW1vdW50ID0gMCwgaW5jb21lX3RoaXJkX2Ftb3VudCA9IDApKSAlPiUgDQogIG11dGF0ZShpbmNvbWVfdG90YWxfYW1vdW50ID0gaW5jb21lX21haW5fYW1vdW50ICsgaW5jb21lX3NlY19hbW91bnQgKyBpbmNvbWVfdGhpcmRfYW1vdW50LA0KICAgICAgICAgZm9vZF9leHBlbnNlc19tbWsgPSBpbmNvbWVfdG90YWxfYW1vdW50ICogZXhwZW5zZV9mb29kLCANCiAgICAgICAgIGluY29tZV9wZXJfY2FwaXRhID0gaW5jb21lX3RvdGFsX2Ftb3VudCAvIGhoX3NpemUpICU+JQ0KICBtdXRhdGUobmVlZHNfZm9vZCA9IGlmZWxzZShuZWVkX2Zvb2QgPiAwLCAxLCAwKSwNCiAgICAgICAgIG5lZWRzX2Nhc2ggPSBpZmVsc2UobmVlZF9jYXNoYXNzaXN0YW5jZSA+IDAsIDEsIDApLA0KICAgICAgICAgbmVlZHNfbWVkaWNhbCA9IGlmZWxzZShuZWVkX21lZGljYWxzZXJ2aWNlc3VwcGx5ID4gMCwgMSwgMCksDQogICAgICAgICBuZWVkc19hZ3JpID0gaWZlbHNlKG5lZWRfZmVydGlsaXplcnMgPiAwIHwgbmVlZF9wZXN0aWNpZGVzID4gMCB8IG5lZWRfdGVjaHN1cHBvcmV4dGVuc2lvbnNlcnYgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2Fjc3RvbWVjaGFuaXNlZGVxdWlwcHJvZCA+IDB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9hY2Nlc3N0b2xhbmQgPiAwIHwgbmVlZF9zZWVkcyA+IDAgfCBuZWVkX2xhbmRyZWhhYmlsaXRhdGlvbiA+IDAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2FjY2Vzc3RvaXJyaWdhdGlvbndhdGVyID4gMCB8IG5lZWRfc3VwcG9ydGZvcnByb2Nlc3Nwcm9kID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9hZ3JpbGFib3VyLCAxLCAwKSwNCiAgICAgICAgIG5lZWRzX2pvYnNsb2FucyA9IGlmZWxzZShuZWVkX2xvYW5zID4gMCB8IG5lZWRfam9ib3Bwb3J0dW5pdHkgPiAwLCAxLCAwKSwNCiAgICAgICAgIG5lZWRzX290aGVyID0gaWZlbHNlKG5lZWRfY2xvdGhlc3NoZWx0ZXJ3YXRlciA+IDAgfCBuZWVkX2VkdWNhdGlvbmFzc2lzdGFuY2UgPiAwIHwgbmVlZF9maXNoZXF1aW9yb3RoZXJzdXBwZm9yID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfaW5mb29uc2FmZXR5bWVhc3VyZXMgPiAwIHwgbmVlZF9tYXJrZXRpbmdzdXBwb3J0ID4gMCB8IG5lZWRfb3RoZXIgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9zdG9yYWdlZXF1aXBtZW50b3JmYWNpID4gMCB8IG5lZWRfdG9vbHMgPiAwIHwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfcmVzdG9ja2luZ2FuaW1hbHMgPiAwIHwgbmVlZF92ZXRlcmluYXJ5c2VydmljZXMgPiAwIHwgbmVlZF9hbmltYWxmZWVkID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfYW5pbWFsc2FsZW1pbmdhcmFudGRwcmljZSA+IDAgfCBuZWVkX3N1cHB0cmFuc29mYW5pbWFsc29ycHJvZCA+IDAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3NwZWNpYWxudXRyaXRpb25mb29kID4gMCwgMSwgMCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KG5lZWRzX2Zvb2QgPSAwLCBuZWVkc19jYXNoID0gMCwgbmVlZHNfbWVkaWNhbCA9IDAsIG5lZWRzX2FncmkgPSAwLCANCiAgICAgICAgICAgICAgICAgIG5lZWRzX2pvYnNsb2FucyA9IDAsIG5lZWRzX290aGVyID0gMCkpICU+JSANCiAgc2VsZWN0KC1jKHNob2NrX290aGVyc3BlY2lmeSwgY292aWRfb3RoZXJzcGVjaWZ5LHNob2NrX3JlZiwgY292aWRfcmVmLCBzaG9ja19kaywgY292aWRfZGssIA0KICAgICAgICAgICAgY3JwX3Byb2RkaWZfb3RoZXJzcGVjaWZ5LCBjcnBfc2FsZWRpZl9vdGhlcnNwZWNpZnksIGxzX251bV9pbmNfZGVjX290aGVyc3BlY2lmeSwgDQogICAgICAgICAgICBsc19mb29kX3N1cHBseV9vdGhlcnNwZWNpZnksIGxzX3Byb2RkaWZfb3RoZXJzcGVjaWZ5LCBuZWVkX2RrLCBuZWVkX290aGVyc3BlY2lmeSwNCiAgICAgICAgICAgIGxzX3NhbGVzZGlmX290aGVyc3BlY2lmeSwgZmlzaF9zYWxlZGlmX290aGVyc3BlY2lmeSwgcmVhc29uc21pZ3JhdGlvbl9vdGhlcnNwZWNpZnksDQogICAgICAgICAgICBhZG0zX2F5ZXlhcndhZHksIGFkbTNfY2hpbiwgYWRtM19rYWNoaW4sIGFkbTNfa2F5YWgsIGFkbTNfa2F5YWgsIGFkbTNfa2F5aW4sDQogICAgICAgICAgICBhZG0zX3Jha2hpbmUsIGFkbTNfc2hhbl9lYXN0LCBhZG0zX3NoYW5fbm9ydGgsIGFkbTNfeWFuZ29uLCBhZG0zX21vbikpICU+JSAgDQogIG11dGF0ZShmb29kX2V4cGVuc2VzX3Blcl9jYXBpdGEgPSBmb29kX2V4cGVuc2VzX21tayAvIGhoX3NpemUgLyAzLCANCiAgICAgICAgIG1lYl9wYyA9IGZvb2RfZXhwZW5zZXNfcGVyX2NhcGl0YSAvICgxOTA1NTUgLyA1KSkgJT4lIA0KICANCiAgbXV0YXRlKGFncmlfaGhkID0gaWZlbHNlKGluY29tZV9tc19hZ3JpY3VsdHVyZSA9PSAxIHwgaW5jb21lX21zX2Zpc2hlcmllcyA9PSAxIHwgaW5jb21lX21zX2xpdmVzdG9jayA9PSAxIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdyaV9hY3Rpdml0eSA9PSAxIHwgaW5jb21lX3NlYyA8PSAxMCwgMSwgMCksDQogICAgICAgICBhZ3JpX21haW4gPSBpZmVsc2UoaW5jb21lX21zX2FncmljdWx0dXJlID09IDEgfCBpbmNvbWVfbXNfZmlzaGVyaWVzID09IDEgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX21zX2Zpc2hlcmllcyA9PSAxIHwgYWdyaV9hY3Rpdml0eSA9PSAxLCAxLCAwKSkNCg0KIyBmc19zY29yZSBtZGVwcml2DQpmc19zaGFyZSA8LSBzdXJ2ZXkgJT4lICANCiAgc2VsZWN0KHN1cnZleV9pZCwgaGhmY3NfaW52LCBmaWVzX3JhdywgY3NpX3dlaWdodGVkKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGhoZmNzX2ludiwgZmllc19yYXcsIGNzaV93ZWlnaHRlZCksIHNjYWxlKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGhoZmNzX2ludiwgZmllc19yYXcsIGNzaV93ZWlnaHRlZCksIHJhbmdlX3duYSkgJT4lIA0KICBtZGVwcml2KGMoImhoZmNzX2ludiIsICJmaWVzX3JhdyIsICJjc2lfd2VpZ2h0ZWQiKSwgbWV0aG9kID0gImJ2Iiwgb3V0cHV0ID0iYWxsIikNCg0KIyBmc19zY29yY2UyIG1kZXByaXYNCmZzX3NoYXJlMiA8LSBzdXJ2ZXkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCksIH4gLiAqIDAuNSkgJT4lIA0KICBzZWxlY3Qoc3VydmV5X2lkLCBmY3Nfc3RhcGxlLCBmY3NfcHVsc2UsIGZjc19kYWlyeSwgZmNzX3Byb3RlaW4sIGZjc192ZWcsIGZjc19mcnVpdCwgZmNzX2ZhdCwgZmNzX3N1Z2FyLCANCiAgICAgICAgIGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzLCBjc19jcmlzaXNfbm9fc2Nob29sLCBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwLCANCiAgICAgICAgIGNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlLCBjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uLCBjc19lbWVyZ2VuY3lfaGhfcmlzaywNCiAgICAgICAgIGZpZXNfZmV3Zm9vZCwgZmllc19za2lwcGVkLCBmaWVzX3dobGRheSwgZmllc19odW5ncnksIGZpZXNfYXRlbGVzcywgZmllc19oZWFsdGh5LA0KICAgICAgICAgICAgICAgICBmaWVzX3J1bm91dCwgZmllc193b3JyaWVkKSAlPiUgDQogIG1kZXByaXYoYygiZmNzX3N0YXBsZSIsICJmY3NfcHVsc2UiLCAiZmNzX2RhaXJ5IiwgImZjc19wcm90ZWluIiwgImZjc192ZWciLCAiZmNzX2ZydWl0IiwgImZjc19mYXQiLCAiZmNzX3N1Z2FyIiwgDQogICAgICAgICAiY3NfY3Jpc2lzX3NvbGRfcHJvZF9hc3NldHMiLCAiY3NfY3Jpc2lzX25vX3NjaG9vbCIsICJjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwIiwgDQogICAgICAgICAiY3NfZW1lcmdlbmN5X3NvbGRfaG91c2UiLCAiY3NfZW1lcmdlbmN5X2hoX21pZ3JhdGlvbiIsICJjc19lbWVyZ2VuY3lfaGhfcmlzayIsDQogICAgICAgICAiZmllc19mZXdmb29kIiwgImZpZXNfc2tpcHBlZCIsICJmaWVzX3dobGRheSIsICJmaWVzX2h1bmdyeSIsICJmaWVzX2F0ZWxlc3MiLCAiZmllc19oZWFsdGh5IiwNCiAgICAgICAgICJmaWVzX3J1bm91dCIsICJmaWVzX3dvcnJpZWQiKSwgb3V0cHV0ID0gImFsbCIpDQoNCiMgcHJpb3JpdHkgc2NvcmVzDQojIHByaW9yaXR5IHNjb3Jlcw0Kc3VydmV5IDwtIHN1cnZleSAlPiUNCiAgbGVmdF9qb2luKGZzX3NoYXJlJGRhdGEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3Qoc2NvcmVfaSwgc3VydmV5X2lkKSwgYnkgPSAic3VydmV5X2lkIikgJT4lIA0KICBsZWZ0X2pvaW4oZnNfc2hhcmUyJGRhdGEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZnNfc2NvcmUyID0gc2NvcmVfaSwgc3VydmV5X2lkKSwgYnkgPSAic3VydmV5X2lkIikgJT4lIA0KICAgbXV0YXRlKHByaW9yaXR5MSA9IGNhc2Vfd2hlbihoaGZjc19pbnYgPj0gbWVhbihoaGZjc19pbnYpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVzX3Jhd19yYW5nZSA+PSBtZWFuKGZpZXNfcmF3X3JhbmdlKSAmIGNzaV93ZWlnaHRlZCA+PSBtZWFuKGNzaV93ZWlnaHRlZCkgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lDQogIG11dGF0ZShwcmlvcml0eTIgPSBpZmVsc2Uoc2NvcmVfaSA+PSBtZWFuKHNjb3JlX2kpLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUocHJpb3JpdHkzID0gY2FzZV93aGVuKGhoZmNzX2ludiA+PSBtZWFuKGhoZmNzX2ludikgJiBmaWVzX3Jhd19yYW5nZSA+PSBtZWFuKGZpZXNfcmF3X3JhbmdlKSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoZmNzX2ludiA+PSBtZWFuKGhoZmNzX2ludikgJiBjc2lfd2VpZ2h0ZWQgPj0gbWVhbihjc2lfd2VpZ2h0ZWQpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllc19yYXdfcmFuZ2UgPj0gbWVhbihmaWVzX3Jhd19yYW5nZSkgJiBjc2lfd2VpZ2h0ZWQgPj0gbWVhbihjc2lfd2VpZ2h0ZWQpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUgDQogIG11dGF0ZShwcmlvcml0eSA9IGNhc2Vfd2hlbihoaGZjc19pbnYgPj0gcXVhbnRpbGUoaGhmY3NfaW52LCBwcm9icyA9IDAuNzUpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVzX3Jhd19yYW5nZSA+PSBxdWFudGlsZShmaWVzX3Jhd19yYW5nZSwgcHJvYnMgPSAwLjc1KSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoZmNzX2ludiA+PSBxdWFudGlsZShoaGZjc19pbnYsIHByb2JzID0gMC43NSkgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaV93ZWlnaHRlZCA+PSBxdWFudGlsZShjc2lfd2VpZ2h0ZWQsIHByb2JzID0gMC43NSkgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVzX3Jhd19yYW5nZSA+PSBxdWFudGlsZShmaWVzX3Jhd19yYW5nZSwgcHJvYnMgPSAwLjc1KSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NpX3dlaWdodGVkID49IHF1YW50aWxlKGNzaV93ZWlnaHRlZCwgcHJvYnMgPSAwLjc1KSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lIA0KICBtdXRhdGUocHJpb3JpdHk1ID0gY2FzZV93aGVuKGhoZmNzX2ludiA+PSBxdWFudGlsZShoaGZjc19pbnYsIHByb2JzID0gMC43NSkgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVzX3Jhd19yYW5nZSA+PSBxdWFudGlsZShmaWVzX3Jhd19yYW5nZSwgcHJvYnMgPSAwLjc1KSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NpX3dlaWdodGVkID49IHF1YW50aWxlKGNzaV93ZWlnaHRlZCwgcHJvYnMgPSAwLjc1KSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lIA0KICByZW5hbWUoZnNfc2NvcmUgPSBzY29yZV9pKQ0KDQojIHN1cnZleSBsb25nDQoNCnN1cnZleV9sb25nIDwtIHN1cnZleSAlPiUNCiAgc2VsZWN0KHN1cnZleV9pZCwgcHJpb3JpdHksIGZzX3Njb3JlLCBmc19zY29yZTIsIG1lYl9wYywgDQogICAgICAgICBjb250YWlucygiY3NfIiksIGNvbnRhaW5zKCJjc2lfIiksIGNvbnRhaW5zKCJmaWVzIiksIGNvbnRhaW5zKCJmY3NfIiksIGNvbnRhaW5zKCJuZWVkc18iKSwgDQogICAgICAgICBoaGZjc19pbnYsIG5lZWQsIA0KICAgICAgICAgaG9oX2ZlbWFsZSwgcnVyYWwsIGV4cGVuc2VfZm9vZCwgbm90X2ltcHJvdmVkX3Nhbml0YXRpb24sIGluY29tZV9tYWluX2NvbXAsIGFncmlfYWN0aXZpdHksDQogICAgICAgICBsaGNzaV9tYXgsIGxoY3NpX3JhbmdlLCBhY2Nlc3NtYXJrZXQpICU+JSANCiAgc2VsZWN0KC1jb250YWlucygid3QiKSwgLW5vdGVmY3NfLCAtbGhjc2lfbWF4X2FnKSAlPiUgDQogIGxlZnRfam9pbihzdXJ2ZXkgJT4lIHNlbGVjdChzdXJ2ZXlfaWQsIGluY29tZV9zb3VyY2UsIGhvaF9lZHVjYXRpb24sIGhvaF9hZ2UsIHJlc2lkZW5jZV90eXBlKSAlPiUgDQogICAgICAgICAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXN1cnZleV9pZCwgbmFtZXNfdG8gPSAib2xkX3ZhciIsIHZhbHVlc190byA9ICJ2YXIiKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHZhbHVlID0gMSkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLW9sZF92YXIpICU+JSANCiAgICAgICAgICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhciwgdmFsdWVzX2Zyb20gPSB2YWx1ZSwgdmFsdWVzX2ZpbGwgPSAwKSwgYnkgPSAic3VydmV5X2lkIikgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gLXN1cnZleV9pZCwgbmFtZXNfdG8gPSAidmFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICByYmluZChzdXJ2ZXkgJT4lIHNlbGVjdChjb250YWlucygic2hvY2tzXyIpLCBzdXJ2ZXlfaWQpICU+JQ0KICAgICAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXN1cnZleV9pZCwgbmFtZXNfdG8gPSAidmFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikpDQoNCg0KIyBzaG93X2NvbCh2aXJpZGlzX3BhbChvcHRpb24gPSAiY2l2aWRpcyIpKDEwKSkNCmBgYA0KDQoNCg0KIyMgSW50cm9kdWN0aW9uIA0KDQpQcmlvcml0aXNhdGlvbiBjYW4gbGFyZ2VseSBiZSBicm9rZW4gaW50byB0d28gc3RlcHMgLS0gZ2VvZ3JhcGhpYyBwcmlvcml0aXNhdGlvbiBhbmQgYmVuZWZpY2lhcnkgc2VsZWN0aW9uLiANCg0KVGhpcyBkb2N1bWVudCBleGFtaW5lcyBkYXRhIGZyb20gdGhlIEZBTy1XRlAgU2hvY2tzLCBBZ3JpY3VsdHVyYWwgTGl2ZWxpaG9vZHMgYW5kIEZvb2QgU2VjdXJpdHkgU3VydmV5LCB0aGUgQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gYW5kIEV2ZW50IERhdGFzZXQgKEFDTEVEKSBhbmQgdGhlIE15YW5tYXIgSW5mb3JtYXRpb24gTWFuYWdlbWVudCBVbml0IChNSU1VKS4gDQoNClRoZSBmaXJzdCBzZWN0aW9uIGRlYWxzIHdpdGggdGhlIGRldmVsb3BtZW50IG9mIGNvcmUgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGNyaXRlcmlhIHVzaW5nIHRoZSBGQU8tV0ZQIHN1cnZleSBkYXRhLiBUaGUgc2Vjb25kIHNlY3Rpb24gbWFrZXMgdXNlIG9mIEFDTEVEIGRhdGEgZm9yIE15YW5tYXIgdG8gZGV2ZWxvcCBhIGNvbmZsaWN0IHNjb3JlIGZvciB0b3duc2hpcCBwcmlvcml0aXNhdGlvbi4gVG93bnNoaXAgYW5kIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBjcml0ZXJpYSBhcmUgbGlua2VkIGJ5IGEgZGVjaXNpb24gdHJlZS4gVGhlIHRoaXJkIHNlY3Rpb24gcHJlc2VudHMgZmxvb2Qgcmlza3MgYnkgdG93bnNoaXAgLS0gdGhlc2UgYXJlIG9ubHkgcHJvYmFiaWxpdGllcyBhbmQgc2VydmUgYXMgcmVmZXJlbmNlcyBmb3IgcHJlcG9zaXRpb25pbmcgYW5kIGRpc2FzdGVyIHJpc2sgcmVkdWN0aW9uLiBUaGV5IG5vdCBpbmNsdWRlZCBpbiB0aGUgb3ZlcmFsbCBwcmlvcml0aXNhdGlvbiBwcm9jZXNzLCB0aG91Z2ggdGhpcyBtaWdodCBjaGFuZ2UgaWYgZGlzYXN0ZXJzIG9jY3VyLiANCg0KIyMjIFJlZmVyZW5jZXMgZm9yIHRoaXMgcmVwb3J0DQoqIEFDTEVEICgyMDIyKS4gQUNMRUQgZGF0YSBmb3IgTXlhbm1hciAoMjAxMC0yMDIyKS4gaHR0cHM6Ly9hY2xlZGRhdGEuY29tLg0KKiBBdGlsbGlvIEJlbmluaSwgQWxkbyBCZW5pbmkgKDIwMjEpLiBtZGVwcml2OiBTeW50aGV0aWMgc2NvcmVzIG9mIG11bHRpcGxlIGRlcHJpdmF0aW9uLiBSIHBhY2thZ2UgdmVyc2lvbiAwLjAuMy4gIGh0dHBzOi8vZ2l0aHViLmNvbS9hLWJlbmluaS9tZGVwcml2Ly4NCiogRkFPIGFuZCBXRlAgKDIwMjIpLiBNeWFubWFyIHwgU2hvY2tzLCBhZ3JpY3VsdHVyYWwgbGl2ZWxpaG9vZHMgYW5kIGZvb2Qgc2VjdXJpdHk6IE1vbml0b3JpbmcgcmVwb3J0LCBNYXJjaCAyMDIyLiBSb21lLiANCiogRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBNeWFubWFyICgyMDIxKS4gNVdzIHJlcG9ydGluZyB0b29sLg0KKiBIQVJQLUYgYW5kIE1JTVUgKDIwMTgpLiBWdWxuZXJhYmlsaXR5IGluIE15YW5tYXI6IEEgU2Vjb25kYXJ5IERhdGEgUmV2aWV3IG9mIE5lZWRzLCBDb3ZlcmFnZSBhbmQgR2Fwcy4gaHR0cDovL3RoZW1pbXUuaW5mby92dWxuZXJhYmlsaXR5LWluLW15YW5tYXIuDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLiBCZW5lZmljaWFyeSBTZWxlY3Rpb24gdXNpbmcgRkFPLVdGUCBzdXJ2ZXkgZGF0YQ0KDQoNCkEgdG90YWwgb2YgYHIgbnJvdyhzdXJ2ZXkpYCBob3VzZWhvbGRzIHdlcmUgaW50ZXJ2aWV3ZWQgaW4gdGhlIEZBTy1XRlAgU2hvY2tzLCBBZ3JpY3VsdHVyYWwgTGl2ZWxpaG9vZHMgYW5kIEZvb2QgU2VjdXJpdHkgU3VydmV5IGluIEF5ZXlhcndhZHksIEthY2hpbiwgS2F5YWgsIEtheWluLCBNb24sIFJha2hpbmUsIFNoYW4gYW5kIFlhbmdvbiB0byBtb25pdG9yIGZvb2Qgc2VjdXJpdHkgYW5kIGxpdmVsaWhvb2RzIG9mIHBlcnNvbnMgaW4gTXlhbm1hci4gU29tZSBvZiB0aGUgbW9zdCBrZXkgZGF0YSBjb2xsZWN0ZWQgd2VyZSBvbiB0aGUgdmFyaW91cyBmb29kIHNlY3VyaXR5IGluZGljZXMgLS0gdGhlIEZvb2QgQ29uc3VtcHRpb24gU2NvcmUgKEZDUyksIHRoZSBGb29kIEluc2VjdXJpdHkgRXhwZXJpZW5jZSBTY2FsZSAoRklFUykgYW5kIHRoZSBMaXZlbGlob29kIENvcGluZyBTdHJhdGVnaWVzIEluZGV4IChDU0kpLiBBZGRpdGlvbmFsbHksIGEgY29tcG9zaXRlIG9mIHRoZSB0aHJlZSBpbmRpY2VzLCB0aGUgRm9vZCBTZWN1cml0eSBTY29yZSBoYXMgYWxzbyBiZWVuIGNhbGN1bGF0ZWQuIEluZm9ybWF0aW9uIHdhcyBhbHNvIGNvbGxlY3RlZCBvbiBiYXNpYyBob3VzZWhvbGQgZGVtb2dyYXBoaWNzIGFzIHdlbGwgb24gaW5jb21lIHNvdXJjZXMuIE11Y2ggbW9yZSBkZXRhaWwgY2FuIGJlIGdsZWFuZWQgZnJvbSB0aGUgcmVwb3J0IGl0c2VsZiAtLSB0aGlzIGRvY3VtZW50IGZvY3VzZXMgb25seSBvbiB0aGUgYXNwZWN0cyBvZiB0aGUgc3VydmV5IHdoaWNoIGNhbiBiZSB1c2VkIGZvciBwcmlvcml0aXNhdGlvbi4NCg0KPGJyPjxicj4NCg0KIyMjIDEuMSBBbiBvdmVydmlldyBvZiB0aGUgZm9vZCBzZWN1cml0eSBpbmRpY2F0b3JzDQoNClRoZSBwbG90IGJlbG93IHJhbmtzIHZhcmlhYmxlcyBpbiBvcmRlciBvZiB0aGVpciBhYmlsaXR5IHRvIHByZWRpY3QgdGhlIHZhcmlvdXMgZm9vZCBpbnNlY3VyaXR5IGNvbXBvc2l0ZSBpbmRpY2VzLiBPbmx5IGVudmlyb25tZW50YWwgb3IgZGVtb2dyYXBoaWMgdmFyaWFibGVzIHdlcmUgdGFrZW4gaW50byBhY2NvdW50IGFzIGl0IHdvdWxkIGJlIHJlZHVuZGFudCB0byBwcmVkaWN0IGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyB1c2luZyB0aGUgY29tcG9uZW50cyBvZiBzYWlkIGluZGljZXMuIE9ubHkgcmVzcG9uc2VzIHRoYXQgb2NjdXJyZWQgbW9yZSB0aGFuIDIwMCB0aW1lcyAob3V0IG9mIDIsNzA4KSBpbiB0aGUgc3VydmV5IHdlcmUgY29uc2lkZXJlZC4gDQoNClZhcmlhYmxlcyB0aGF0IGFyZSBtb3JlIHJlZCBhcmUgbW9zdCBsaWtlbHkgdG8gcmVzdWx0IGluIGhpZ2ggZm9vZCBpbnNlY3VyaXR5IHNjb3JlcyAodGhhdCBpcywgaGlnaGVyIGZvb2QgaW5zZWN1cml0eSkgYW5kIHZhcmlhYmxlcyB0aGF0IGFyZSBtb3JlIGJsdWUgYXJlIG1vcmUgbGlrZWx5IHRvIHJlc3VsdCBpbiBsb3dlciBmb29kIGluc2VjdXJpdHkgc2NvcmVzLiBUaGUgZG90dGVkIHJlZCBsaW5lIGRvd24gdGhlIG1pZGRsZSBhdCAqeD0wKiBzcGxpdHMgdmFyaWFibGVzIGludG8gd2hldGhlciB0aGUgcHJlZGljdCBoaWdoZXIgZm9vZCBpbnNlY3VyaXR5IChwb3NpdGl2ZSBudW1iZXJzKSBvciBsb3dlciBmb29kIGluc2VjdXJpdHkgKG5lZ2F0aXZlIG51bWJlcnMpLiANCg0KPGJyPg0KDQpgYGB7ciBjb2VmZmljaWVudC1wbG90LXByaW9yaXR5LCBmaWcuaGVpZ2h0PTh9DQpsbV9wcmVwX2xvbmcgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkodmFyKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IGlmZWxzZSh2YWx1ZSA+IDAsIDEsIDApLA0KICAgICAgICAgY291bnQgPSBzdW0oY291bnQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKGNvdW50ID4gMjAwKSAlPiUgIyBhZGp1c3QgdGhlIHRocmVzaG9sZCBuDQogIHNlbGVjdCgtY291bnQpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhciwgdmFsdWVzX2Zyb20gPSB2YWx1ZSwgdmFsdWVzX2ZuID0gbWF4KSAlPiUgDQogIHNlbGVjdCgtc3VydmV5X2lkLCAtc2hvY2tzX25vbmUpDQp9DQoNCnBsb3RfY29lZiA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSAgDQogICAgdGlkeShjb25mLmludCA9IFRSVUUpICU+JQ0KICAgIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSANCiAgICBtdXRhdGUodGVybSA9IHN0cl9yZXBsYWNlKHRlcm0sICJpbmNvbWVfbXMiLCAiaW5jb21lX3NvdXJjZSIpLA0KICAgICAgICAgICB0ZXJtID0gc3RyX3JlcGxhY2UodGVybSwgImhvaF9hZ2UiLCAiIiksDQogICAgICAgICAgIHRlcm0gPSBzdHJfcmVwbGFjZSh0ZXJtLCAiaG9oX2VkdWNhdGlvbiIsICIiKSwgDQogICAgICAgICAgIHRlcm0gPSBmY3RfcmVvcmRlcih0ZXJtLCBlc3RpbWF0ZSkpICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBlc3RpbWF0ZSwgeSA9IHRlcm0sIGNvbG91ciA9IGVzdGltYXRlKSkgKyANCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKw0KICAgIGdlb21fcG9pbnQoKSArIA0KICAgIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gY29uZi5sb3csIHhtYXggPSBjb25mLmhpZ2gpLCBoZWlnaHQgPSAwLjIpICsNCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAidHVyYm8iKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LjUpLA0KICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIiksDQogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsNCiAgICBsYWJzKHggPSAiRXN0aW1hdGUiLCB5ID0gIiIpDQp9DQoNCnN1cnZleV9sb25nICU+JSAgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhciwgInNob2Nrc198aG9oX3xydXJhbHxleHBlbnNlX2Zvb2R8bm90X2ltcHJvdmVkfGFncmlfYWN0aXZpdHl8aW5jb21lX21zX3xlZHVfIikgfA0KICAgICAgICAgICB2YXIgJWluJSBjKCJmc19zY29yZTIiLCAiZXhwZW5zZV9mb29kIikpICU+JSANCiAgbG1fcHJlcF9sb25nKCkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmUyID0gbG9nKGZzX3Njb3JlMikpICU+JSANCiAgbXV0YXRlKGZzX3Njb3JlMiA9IGlmZWxzZShpcy5pbmZpbml0ZShmc19zY29yZTIpLCAwLCBmc19zY29yZTIpKSAlPiUgDQogIGxtKGZzX3Njb3JlMiB+IC4sIGRhdGEgPSAuKSAlPiUgDQogIHBsb3RfY29lZigpICsgDQogIGxhYnModGl0bGUgPSAiRm9vZCBzZWN1cml0eSBzY29yZSIpICsgDQogIA0Kc3VydmV5X2xvbmcgJT4lDQogICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KHZhciwgInNob2Nrc198aG9oX3xydXJhbHxleHBlbnNlX2Zvb2R8bm90X2ltcHJvdmVkfGFncmlfYWN0aXZpdHl8aW5jb21lX21zX3xlZHVfIikgfA0KICAgICAgICAgdmFyICVpbiUgYygiY3NpX3dlaWdodGVkIiwgImV4cGVuc2VfZm9vZCIpKSAlPiUNCiAgbG1fcHJlcF9sb25nKCkgJT4lDQogIGxtKGNzaV93ZWlnaHRlZCB+IC4sIGRhdGEgPSAuKSAlPiUNCiAgcGxvdF9jb2VmKCkgKyANCiAgbGFicyh0aXRsZSA9ICJDb3Bpbmcgc3RyYXRlZ2llcyBpbmRleCIpICsgDQogIA0Kc3VydmV5X2xvbmcgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhciwgInNob2Nrc198aG9oX3xydXJhbHxleHBlbnNlX2Zvb2R8bm90X2ltcHJvdmVkfGFncmlfYWN0aXZpdHl8aW5jb21lX21zX3xlZHVfIikgfA0KICAgICAgICAgICB2YXIgJWluJSBjKCJoaGZjc19pbnYiLCAiZXhwZW5zZV9mb29kIikpICU+JQ0KICBsbV9wcmVwX2xvbmcoKSAlPiUNCiAgbG0oaGhmY3NfaW52IH4gLiwgZGF0YSA9IC4pICU+JQ0KICBwbG90X2NvZWYoKSArIA0KICBsYWJzKHRpdGxlID0gIkZvb2QgY29uc3VtcHRpb24gc2NvcmUiKSArIA0KDQpzdXJ2ZXlfbG9uZyAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QodmFyLCAic2hvY2tzX3xob2hffHJ1cmFsfGV4cGVuc2VfZm9vZHxub3RfaW1wcm92ZWR8YWdyaV9hY3Rpdml0eXxpbmNvbWVfbXNffGVkdV8iKSB8DQogICAgICAgICAgIHZhciAlaW4lIGMoImZpZXNfcmF3X3JhbmdlIiwgImV4cGVuc2VfZm9vZCIpKSAlPiUNCiAgbG1fcHJlcF9sb25nKCkgJT4lDQogIGxtKGZpZXNfcmF3X3JhbmdlIH4gLiwgZGF0YSA9IC4pICU+JQ0KICBwbG90X2NvZWYoKSArIA0KICBsYWJzKHRpdGxlID0gIkZvb2QgaW5zZWN1cml0eSBleHBlcmllbmNlIHNjYWxlIikNCmBgYA0KDQo8YnI+DQoNClRoZSBwbG90cyBhYm92ZSByYW5rcyB2YXJpYWJsZXMgaW4gb3JkZXIgb2YgdGhlaXIgYWJpbGl0eSB0byBwcmVkaWN0IHRoZSB2YXJpb3VzIGZvb2Qgc2VjdXJpdHkgY29tcG9zaXRlIGluZGljZXMuIFZhcmlhYmxlcyB0aGF0IGFyZSBtb3JlIHJlZCBhcmUgbW9yZSBsaWtlbHkgdG8gcmVzdWx0IGluIGhpZ2ggZm9vZCBpbnNlY3VyaXR5IHNjb3JlcyAodGhhdCBpcywgaGlnaGVyIGZvb2QgaW5zZWN1cml0eSkgYW5kIHZhcmlhYmxlcyB0aGF0IGFyZSBtb3JlIGJsdWUgYXJlIG1vcmUgbGlrZWx5IHRvIHJlc3VsdHMgaW4gbG93ZXIgZm9vZCBpbnNlY3VyaXR5IHNjb3Jlcy4gDQoNClRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IGluIHByZWRpY3RpbmcgaGlnaCBmb29kIHNlY3VyaXR5IHNjb3JlcyBhcmUgYSBob3VzZWhvbGQncyBleHBvc3VyZSB0byBjb25mbGljdCwgd2hldGhlciBvciBub3QgdGhleSBsb3N0IGVtcGxveW1lbnQgb3Igd29yayBvcHBvcnR1bml0aWVzLCB3aGV0aGVyIG9yIG5vdCB0aGV5IHdlcmUgZW5nYWdlZCBpbiBjYXN1YWwgbm9uLWFncmljdWx0dXJhbCBsYWJvdXIgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkgcmVwb3J0ZWQgbm8gaW5jb21lIGluIHRoZSB0aHJlZSBtb250aHMgcHJpb3IgdG8gdGhlIHN1cnZleS4gDQoNClRoZXNlIHZhcmlhYmxlcyBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHByZWxpbWluYXJ5IGxpc3Qgb2YgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGNyaXRlcmlhIGZvciBmb29kIHNlY3VyaXR5IGFuZCBsaXZlbGlob29kcyBwcm9ncmFtbWluZy4gVGhpcyBsaXN0IGlzLCBvZiBjb3Vyc2UsIG5vbi1leGhhdXN0aXZlIGFzIGl0IG9ubHkgaW5jbHVkZXMgdmFyaWFibGVzIHRoYXQgd2VyZSBpbmNsdWRlZCBpbiB0aGUgRkFPLVdGUCBzdXJ2ZXkuIA0KDQpUaGUgdmFyaWFibGVzIHRoYXQgd2VyZSB0aGUgYmVzdCBwcmVkaWN0b3JzIG9mIGxvdyBmb29kIGluc2VjdXJpdHkgd2VyZSB3aGV0aGVyIG9yIG5vdCB0aGUgaGVhZCBvZiBob3VzZWhvbGQgaGFkIGNvbXBsZXRlZCBoaWdoZXIgZWR1Y2F0aW9uIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgbWFpbiBpbmNvbWUgc291cmNlIG9mIHRoZSBob3VzZWhvbGQgd2FzIHN0YWJsZSBub24tYWdyaWN1bHR1cmFsIGVtcGxveW1lbnQuDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgU2V0dGluZyBhIHRocmVzaG9sZCBmb3IgcHJpb3JpdGlzYXRpb24gDQoNCkFuIGltcG9ydGFudCBzdGVwIGlzIG5hcnJvd2luZyBkb3duIHRoZSBwb3B1bGF0aW9uIHRvIGEgcHJpb3JpdHkgZ3JvdXAgLS0gRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGRvIG5vdCBoYXZlIHRoZSByZXNvdXJjZXMgdG8gdGFyZ2V0IGFsbCBwZXJzb25zLg0KDQo+IEEgaG91c2Vob2xkIHdhcyBjb25zaWRlcmVkIHRvIGJlIGEgcHJpb3JpdHkgZm9yIGludGVydmVudGlvbiB3aGVuIHRoZXkgd2VyZSBhYm92ZSB0aGUgNzV0aCBwZXJjZW50aWxlIGluIGF0IGxlYXN0IHR3byBvdXQgb2YgdGhlIHRocmVlIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyAoZm9vZCBjb25zdW1wdGlvbiBzY29yZSwgY29waW5nIHN0cmF0ZWdpZXMgaW5kZXggYW5kIGZvb2QgaW5zZWN1cml0eSBleHBlcmllbmNlIHNjYWxlKQ0KDQpBcHByb3hpbWF0ZWx5IDM0JSBvZiB0aGUgdG90YWwgcG9wdWxhdGlvbiBmYWxscyBpbnRvIHRoaXMgcHJpb3JpdHkgZ3JvdXAuIFRoZSBwbG90IGJlbG93IHNob3dzIHRoZSBmb29kIHNlY3VyaXR5IHN1Yi1pbmRpY2F0b3JzIHRoYXQgYXJlIHRoZSBtb3N0IGltcG9ydGFudCBpbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgaG91c2Vob2xkIGZhbGxzIGludG8gdGhlIHByaW9yaXR5IGdyb3VwIG9yIG5vdC4gDQoNClRoZSBwbG90cyBiZWxvdyBzaG93cyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYXZlcmFnZSB2YWx1ZXMgb2YgZm9vZCBzZWN1cml0eSBpbmRleCBjb21wb25lbnRzIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgcHJpb3JpdHkgaG91c2Vob2xkcyBvciBub3QuIFZhcmlhYmxlcyBpbiBibHVlIGNvcnJlc3BvbmQgdG8gQ29waW5nIFN0cmF0ZWdpZXMgSW5kZXggaW5kaWNhdG9ycywgdGhvc2UgaW4gcmVkIHRvIHRoZSBGb29kIEluc2VjdXJpdHkgRXhwZXJpZW5jZSBTY2FsZS4gDQoNClRob3NlIGluIGdyZWVuIGNvcnJlc3BvbmQgdG8gdGhlIEZvb2QgQ29uc3VtcHRpb24gU2NvcmUgLS0gZm9yIHRoZXNlIGluZGljYXRvcnMsIHRoZXkgaGF2ZSBiZWVuIHJlc2NhbGVkIHNvIHRoYXQgYSB2YWx1ZSBvZiAxIHNob3dzIHRoYXQgYSBob3VzZWhvbGQgaGFzIG5vdCBjb25zdW1lZCB0aGF0IGZvb2QgZ3JvdXAgYXQgYWxsIGluIHRoZSBwcmV2aW91cyA3IGRheXMgYW5kIGEgdmFsdWUgb2YgMCBzaG93cyB0aGF0IHRoZXkgaGF2ZSBjb25zdW1lZCB0aGF0IGZvb2QgZ3JvdXAgZXZlcnkgZGF5IGZvciB0aGUgcGFzdCA3IGRheXMuIA0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LXByaW9yaXR5LWdyb3VwLWNvbXBhcmlzb259DQpzdXJ2ZXkgJT4lIHNlbGVjdChjb250YWlucygiZmllcyIpLCBjb250YWlucygiZmNzXyIpLCBjb250YWlucygiY3NfZW1lcmdlbmN5IiksIGNvbnRhaW5zKCJjc19jcmlzaXMiKSwgDQogICAgICAgICAgICAgICAgICBwcmlvcml0eSkgJT4lIA0KICBzZWxlY3QoLWZpZXNfcmF3LCAtZmllc19yYXdfcmFuZ2UsIC1ub3RlZmNzXywgLWhoZmNzX2ludiwgLWZjc19fYm9yZGVybGluZV9wb29yLCAtY29udGFpbnMoInd0IiksIC1jb250YWlucygiaGhzIikpICU+JQ0KICBkcm9wX25hKCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IC1wcmlvcml0eSwgbmFtZXNfdG8gPSAidmFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBncm91cF9ieSh2YXIsIHByaW9yaXR5KSAlPiUgDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbih2YWx1ZSkpICU+JSANCiAgYXJyYW5nZShkZXNjKG1lYW4pKSAlPiUgDQogIG11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KHZhciwgImZjcyIpIH4gImZjcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhciwgImNzXyIpIH4gImNzaSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdCh2YXIsICJmaWVzIikgfiAiZmllcyIpLA0KICAgICAgICAgdmFyID0gcmVvcmRlcl93aXRoaW4odmFyLCBieSA9IG1lYW4sIHdpdGhpbiA9IGdyb3VwKSwgDQogICAgICAgICBwcmlvcml0eSA9IHJlY29kZShwcmlvcml0eSwgYDBgID0gIm5vdF9wcmlvcml0eSIsIGAxYCA9ICJwcmlvcml0eSIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1lYW4sIHkgPSByZW9yZGVyX3dpdGhpbih2YXIsIGJ5ID0gbWVhbiwgd2l0aGluID0gZ3JvdXApLCBmaWxsID0gZ3JvdXApKSArIA0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChyb3VuZChtZWFuLCBkaWdpdHMgPSAyKSkpLCBzaXplID0gMywgaGp1c3QgPSAtMC4xKSArIA0KICBsYWJzKHggPSAiTWVhbiIsIHkgPSAiIiwgdGl0bGUgPSAiUHJldmFsZW5jZSBvZiBmb29kIGluc2VjdXJpdHkgaW4gdGhlIHN1cnZleWVkIHBvcHVsYXRpb24iKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsNCiAgZXhwYW5kX2xpbWl0cyh4ID0gMS4wNSkgKw0KICBmYWNldF93cmFwKH5wcmlvcml0eSkgKyANCiAgc2NhbGVfeV9yZW9yZGVyZWQoKQ0KYGBgDQoNCjxicj4gDQoNCldoaWxzdCBib3RoIGdyb3VwcyB0ZW5kIHRvIGNvbnN1bWUgbG93IGFtb3VudHMgb2YgZGFpcnksIHB1bHNlcywgc3VnYXIgYW5kIGZydWl0cywgdGhlc2UgdHJlbmRzIGFyZSBtdWNoIG1vcmUgcHJvbm91bmNlZCBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAuIEFkZGl0aW9uYWxseSwgaG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAgYXJlIG1vcmUgdGhhbiB0d2ljZSBhcyBsaWtlbHkgdG8gaGF2ZSBwb29yIHByb3RlaW4gY29uc3VtcHRpb24sIGJlIHdvcnJpZWQgYWJvdXQgbm90IGhhdmluZyBlbm91Z2ggZm9vZCBhbmQgZWF0IGxlc3MgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuIA0KDQpIb3VzZWhvbGRzIGluIHRoZSBwcmlvcml0eSBncm91cCB3ZXJlIGFsc28gbW9yZSB0aGFuIGZvdXIgdGltZXMgYXMgbGlrZWx5IHRvIGhhdmUgcmVkdWNlZCBoZWFsdGhjYXJlIGV4cGVuZGl0dXJlcywgaGF2ZSBzb2xkIHByb2R1Y3RpdmUgYXNzZXRzIGFuZCBiZSB1bmFibGUgdG8gZWF0IGhlYWx0aHkgYW5kIG51dHJpdGlvdXMgZm9vZHMgYW5kIGVhdCBvbmx5IGEgZmV3IGtpbmRzIG9mIGZvb2RzLiBUaGV5IGFyZSBhbHNvIG1vcmUgdGhhbiBmaXZlIHRpbWVzIGFzIGxpa2xleSB0byBza2lwcGVkIG1lYWxzIG9yIGdvbmUgaHVuZ3J5LiANCg0KPGJyPjxicj4NCg0KIyMjIDEuMyBEZWNpc2lvbiB0cmVlDQoNCmBgYHtyIGRmLXRyZWUtcnVsZXN9DQoNCnRyZWU0IDwtIHN1cnZleSAlPiUgDQogIHJwYXJ0KHByaW9yaXR5IH4gIHNob2Nrc19sb3N0d29yayArIHNob2Nrc19zaWNrbmVzc2RlYXRoICsgc2hvY2tzX2Zvb2RwcmljZXMgKyBzaG9ja3NfY29uZmxpY3QgKyBzaG9ja3NfY2FudHdvcmtidXNpbmVzcyArDQogICAgICAgICAgc2hvY2tzX25hdHVyYWxoYXphcmQgKyBzaG9ja3NfYWNjZXNzbWFya2V0ICsgc2hvY2tzX3ByaWNlc290aGVyICsgc2hvY2tzX290aGVyICsgDQogICAgICAgICAgaG9oX2ZlbWFsZSArIHJ1cmFsICsgbm90X2ltcHJvdmVkX3Nhbml0YXRpb24sDQogICAgICAgIGRhdGEgPSAuLCAgd2VpZ2h0cyA9IGNvbWJpbmVkX3d0ICwgY3AgPSAwLjAxKQ0KDQpzdXJ2ZXkgPC0gc3VydmV5ICU+JSANCiAgbXV0YXRlKHJ1bGU0ID0gcm93Lm5hbWVzKHRyZWU0JGZyYW1lKVt0cmVlNCR3aGVyZV0pICU+JSANCiAgbGVmdF9qb2luKHJwYXJ0LnJ1bGVzLnRhYmxlKHRyZWU0KSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihMZWFmID09IFRSVUUpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKHJ1bGU0ID0gUnVsZSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShydWxlNCkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2Uoc3VicnVsZXM0ID0gcGFzdGUoU3VicnVsZSwgY29sbGFwc2UgPSAiLCIpKSwgYnkgPSAicnVsZTQiKSANCg0KYGBgDQoNCg0KSG93ZXZlciBsYXJnZSB0aGUgZGlmZmVyZW5jZXMgYXJlIGJldHdlZW4gdGhlIGZvb2Qgc2VjdXJpdHkgc3RhdHVzZXMgb2YgdGhvc2UgaW4gdGhlIHByaW9yaXR5IGdyb3VwIGFuZCB0aG9zZSBvdXRzaWRlIG9mIGl0LCBtYW55IG9mIHRoZXNlIGluZGljYXRvcnMgYXJlIG5vdCBlYXNpbHkgb2JzZXJ2YWJsZS4gSXQgd291bGQgYmUgcXVpdGUgY2hhbGxlbmdpbmcgdG8gY29uZHVjdCBhIGxhcmdlLXNjYWxlIGNvbXByZWhlbnNpdmUgZm9vZCBzZWN1cml0eSBzdXJ2ZXkgcHJpb3IgdG8gd2hhdCBGQU8tV0ZQIGhhdmUgZG9uZS4gDQoNClRoaXMgbmVjZXNzaXRhdGVzIHRoZSBjcmVhdGlvbiBvZiBzaW1wbGUgdG9vbCB0byBhaWQgaW4gcHJpb3JpdGlzYXRpb24uIEEgc2ltcGxlIHRyZWUgaGFzIGJlZW4gZGV2ZWxvcGVkLCBjb25zaWRlcmluZyBvbmx5IHRoZSB2YXJpYWJsZXMgaW4gdGhlIEZBTy1XRlAgc3VydmV5IHRoYXQgYXJlIGVhc2lseSBvYnNlcnZhYmxlLiBUaGUgdHJlZSBiZWxvdyB0YWtlcyBpbnRvIGFjY291bnQgb25seSB0aHJlZSB2YXJpYWJsZXMgLS0gd2hldGhlciBvciBub3QgYSBob3VzZWhvbGQgaXMgaW4gYSBydXJhbCBhcmVhLCB3aGV0aGVyIG9yIG5vdCB0aGV5IGhhdmUgZXhwZXJpZW5jZWQgdmlvbGVuY2UsIGluc2VjdXJpdHkgb3IgY29uZmxpY3QgaW4gdGhlIHBhc3QgdGhyZWUgbW9udGhzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGV5IGhhdmUgbG9zdCB3b3JrIG9yIGVtcGxveW1lbnQgb3Bwb3J0dW5pdGllcyBpbiB0aGUgcGFzdCB0aHJlZSBtb250aHMuIA0KDQpXaXRoaW4gZWFjaCBibHVlIHNxdWFyZSwgdGhlIGZpZ3VyZSBpbiBib2xkIHNob3cgdGhlIHBlcmNlbnRhZ2Ugb2YgZWFjaCBncm91cCB0aGF0IGFyZSBwcmlvcml0eSBob3VzZWhvbGRzIGFuZCB0aGUgZmlndXJlcyBpbiBpdGFsaWNzIHNob3cgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiBpbiBlYWNoIG5vZGUuIA0KDQo8YnI+DQoNCioqRGVjaXNpb24gdHJlZSoqDQohW10oZGVjaXNpb25fdHJlZS5wbmcpDQo8YnI+DQoNClRoZSBwZXJjZW50YWdlIG9mIHByaW9yaXR5IGhvdXNlaG9sZHMgaW4gcnVyYWwgYXJlYXMgaXMgbXVjaCBoaWdoZXIgdGhhbiBpbiB1cmJhbiBvbmVzICgzNy42JSB2cyAyNi4xJSkuIEZvciBydXJhbCBhcmVhcywgdGhlIGluZGljYXRvciB0aGF0IGJlc3QgZGlzdGluZ3Vpc2hlcyBwcmlvcml0eSBob3VzZWhvbGRzIGlzIHdoZXRoZXIgb3IgdGhleSBoYXZlIGRpcmVjdGx5IGV4cGVyaWVuY2VkIHZpb2xlbmNlLCBpbnNlY3VyaXR5IG9yIGNvbmZsaWN0IGluIHRoZSBwYXN0IHRocmVlIG1vbnRocy4gVGhlIGZhY3RvciB0aGF0IGJlc3QgZGlzdGluZ3Vpc2hlcyBwcmlvcml0eSBob3VzZWhvbGRzIGluIHVyYmFuIGFyZWFzIGlzIHdoZXRoZXIgb3Igbm90IHRoZXkgaGF2ZSBsb3N0IHdvcmsgb3IgZW1wbG95bWVudCBvcHBvcnR1bml0aWVzIGluIHRoZSBwYXN0IHRocmVlIG1vbnRocy4gIA0KDQpUaGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGRlY2lzaW9uIHRyZWUgaXMgbm90IGV4YWN0bHkgc3BlY3RhY3VsYXIgLS0gaWYgYSBwYXJ0bmVyIHdhbnRlZCB0byB0YXJnZXQgYW4gZW50aXJlIGNvbW11bml0eSwgdGhlIHRocmVzaG9sZCBmb3IgYmxhbmtldCBjb3ZlcmFnZSB3b3VsZCBiZSBhcm91bmQgNzUlIG9yIDgwJSBiZWluZyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAuIEJ1dCB0aGUgZGVjaXNpb24gdHJlZSBpcyB2ZXJ5IHNpbXBsZSBhbmQgdW5kZXJzdGFuZGFibGUgKGFuZCBhbGwgdGhlIHJlZ3Jlc3Npb24gbW9kZWxzIGRldmVsb3BlZCB3ZXJlIHZlcnkgd2VhaykuIEFkZGl0aW9uYWwgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGNyaXRlcmlhIHdpbGwgYmUgbmVjZXNzYXJ5LCBidXQgdGhpcyBkZWNpc2lvbiB0cmVlIGRvZXMgYXQgbGVhc3QgZ2l2ZSBzb21lIGRpcmVjdGlvbiBmb3IgZ2VvZ3JhcGhpYyBwcmlvcml0aXNhdGlvbiwgd2hpY2ggaXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24uIA0KDQo8YnI+PGJyPg0KDQojIyMgMS40IEV4Y2VwdGlvbnMgZm9yIHRhcmdldGluZyBhZ3JpY3VsdHVyYWwgaG91c2Vob2xkcw0KDQo2NC43JSBvZiB0aGUgdG90YWwgcG9wdWxhdGlvbiBpcyBpbiB0aGUgdHJlZSBub2RlICpbNl0qICh0aGUgbm9kZXMgYXJlIGFsbCBudW1iZXJlZCBpbiB0aGUgZGVjaXNpb24gdHJlZSBhYm92ZSkgLS0gd2l0aGluIHRoaXMgZ3JvdXAgYXJlIGhvdXNlaG9sZHMgd2hvIHJlc2lkZSBpbiBydXJhbCBhcmVhcyBidXQgaGF2ZSBub3QgYmVlbiBhZmZlY3RlZCBieSB2aW9sZW5jZSwgY29uZmxpY3Qgb3IgaW5zZWN1cml0eS4gR2l2ZW4gdGhhdCB0aGlzIGlzIGEgc2lnbmlmaWNhbnQgY2h1bmsgb2YgdGhlIHBvcHVsYXRpb24gd2hlcmUsIHdpdGggcmVmZXJlbmNlIHRvIHRoZSBwbG90IGJlbG93LCA3OCUgb2YgdGhlIHBvcHVsYXRpb24gaXMgaW52b2x2ZWQgaW4gYWdyaWN1bHR1cmUsIGFuIGV4Y2VwdGlvbiBjYW4gYmUgbWFkZSBpbiB0aGlzIG9uZSBpbnN0YW5jZSwgdG8gc3VwcG9ydCBwYXJ0bmVycyB3aG8gd2FudCB0byB0YXJnZXQgYWdyaWN1bHR1cmFsIGhvdXNlaG9sZHMgd2hvIGhhdmUgbm90IGJlZW4gYWZmZWN0ZWQgYnkgdGhlIGNvbmZsaWN0LiAgDQoNCkl0IG11c3Qgc3RpbGwgYmUgbWVudGlvbmVkIHRoYXQgYWlkIGZsb3cgZmlyc3QgdG8gdGhlIGhvdXNlaG9sZHMgaW4gbm9kZSAqWzddKiwgd2hlcmUgdGhlIHByb3BvcnRpb24gb2YgaG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAgaXMgaGlnaGVzdC4gT25seSBhZnRlciB0aGUgbmVlZHMgb2YgdGhpcyBwb3B1bGF0aW9uIGFyZSBtZXQgc2hvdWxkIGhvdXNlaG9sZHMgaW4gbm9kZSAqWzZdKiBiZSB0YXJnZXRlZC4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1wYy1hZ3JpfQ0Kc3VydmV5ICU+JSANCiAgbXV0YXRlKGFncmlfaGhkID0gYWdyaV9oaGQgKiBjb21iaW5lZF93dCkgJT4lIA0KICBncm91cF9ieShydWxlNCkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtID0gc3VtKGFncmlfaGhkKSwgDQogICAgICAgICAgICBjb21iaW5lZF93dCA9IHN1bShjb21iaW5lZF93dCkpICU+JSANCiAgbXV0YXRlKHBjX2FnID0gc3VtIC8gY29tYmluZWRfd3QsIA0KICAgICAgICAgcGMgPSBjb21iaW5lZF93dCAvIHN1bShjb21iaW5lZF93dCkpICU+JSANCiAgbXV0YXRlKHJ1bGU0ID0gZmN0X3JldihydWxlNCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBydWxlNCwgZmlsbCA9IHBjX2FnKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocm91bmQocGNfYWcsIGRpZ2l0cyA9IDMpKSksDQogICAgICAgICAgICBoanVzdCA9IC0wLjEpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSkgKyAgIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKw0KICBsYWJzKHggPSAiUGVyY2VudCBvZiB0b3RhbCBwb3B1bGF0aW9uIiwgDQogICAgICAgeSA9ICJUcmVlIG5vZGUiLA0KICAgICAgIHRpdGxlID0gIlNoYXJlIG9mIGFncmljdWx0dXJhbCBob3VzZWhvbGRzIGJ5IHRyZWUgbm9kZSIsIA0KICAgICAgIGZpbGwgPSAiJSBhZ3JpXG5oaGQiKSArIA0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArIA0KICBleHBhbmRfbGltaXRzKHggPSAuNjgpDQpgYGANCg0KPGJyPiANCg0KVGhlIHRyZWUgYmVsb3cgY2FycmllcyBvbiBmcm9tIG5vZGUgKls2XSogb2YgdGhlIG1haW4gZGVjaXNpb24gdHJlZSBpbiB0aGUgc2VjdGlvbiBhYm92ZS4gV2l0aGluIHRoaXMgZ3JvdXAgb2YgcnVyYWwgaG91c2Vob2xkcyBub3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QgKDY0LjclIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uKSwgaWRlbnRpZnlpbmcgaG91c2Vob2xkcyB3aG8gaGF2ZSBsb3N0IGFjY2VzcyB0byBtYXJrZXRzIGR1ZSB0byBjb25mbGljdCwgaW5mcmFzdHJ1Y3R1cmUgZGFtYWdlIG9yIG90aGVyIGFjY2VzcyBpc3N1ZXMgYW5kIGhvdXNlaG9sZHMgd2hvIGhhdmUgYmVlbiBhZmZlY3RlZCBieSBuYXR1cmFsIGhhemFyZHMgKHRoZSBtb3N0IGNvbW1vbiBvZiB3aGljaCBpcyBmbG9vZGluZykgaW1wcm92ZXMgdGhlIGNoYW5jZXMgb2YgdGFyZ2V0aW5nIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIHRvIHNsaWdodGx5IGFib3ZlIDUwJS4gDQoNCkFueSBmdXJ0aGVyIGNvbmRpdGlvbnMgYXBwbGllZCBvbiB0aGUgdHJlZSBvbmx5IHJlc3VsdCBpbiBleHRyZW1lbHkgbWFyZ2luYWwgZ2FpbnMuIA0KDQo8YnI+DQoNCioqRGVjaXNpb24gdHJlZSAtLSBmcm9tIHRyZWUgbm9kZSBbNl0qKg0KIVtdKGFncmljdWx0dXJhbF9leGNlcHRpb24ucG5nKQ0KDQo8YnI+DQoNCkl0IGlzIHBlcmhhcHMgYmVzdCB0byB0YXJnZXQgcHJpb3JpdHkgaG91c2Vob2xkcyBpbiB0aGVzZSBhcmVhcyBieSBlc3RhYmxpc2hpbmcgY2xlYXIgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGNyaXRlcmlhLiBUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgYmVzdCBwcmVkaWN0b3JzIG9mIGZvb2QgaW5zZWN1cml0eSB3aXRoaW4gdGhlIGhvdXNlaG9sZHMgaW4gbm9kZSAqWzZdKi4gDQoNClRoZSB2YXJpYWJsZXMgd2l0aGluIHRoZSBGQU8tV0ZQIHN1cnZleSBtb3N0IG9mIHVzZSB0byBwYXJ0bmVycyB0YXJnZXRpbmcgcHJpb3JpdHkgaG91c2Vob2xkcyBpbiBub2RlICpbNl0qIGFyZSB3aGV0aGVyIG9yIG5vdCBhIGhvdXNlaG9sZCBoYXMgaW1wcm92ZWQgc2FuaXRhdGlvbiBhbmQgdGhlIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgb2YgdGhlIGhlYWQgb2YgdGhlIGhvdXNlaG9sZC4gVGhlIG1vc3QgaW1wb3J0YW50IHNob2NrcyBmb3IgdGhpcyBncm91cCB3ZXJlIG5hdHVyYWwgaGF6YXJkcyBhbmQgdGhlIGxvc3Mgb2Ygd29yayBvciBlbXBsb3ltZW50IG9wcG9ydHVuaXRpZXMuIEFzIG5vdGVkIGVhcmxpZXIsIG5vIGhvdXNlaG9sZHMgaW4gdGhpcyBncm91cCBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgY29uZmxpY3QuIA0KDQo8YnI+DQoNCmBgYHtyIGNvZWYtcGxvdC1ub2RlNn0NCnN1cnZleSAlPiUgZmlsdGVyKHJ1bGU0ID09IDYpICU+JSANCiAgc2VsZWN0KGNvbnRhaW5zKCJzaG9ja3NfIiksIG5vdF9pbXByb3ZlZF9zYW5pdGF0aW9uLCBjb250YWlucygiaW5jb21lX21zXyIpLA0KICAgICAgICAgaG9oX2VkdWNhdGlvbiwgaG9oX2ZlbWFsZSwgaG9oX2FnZSwgZnNfc2NvcmUyKSAlPiUgDQogIHNlbGVjdCgtYyhzaG9ja3NfY29uZmxpY3QsIGluY29tZV9tc19maXNoZXJpZXMpKSAlPiUgDQogIG11dGF0ZShmc19zY29yZTIgPSBsb2coZnNfc2NvcmUyKSkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmUyID0gaWZlbHNlKGlzLmluZmluaXRlKGZzX3Njb3JlMiksIDAsIGZzX3Njb3JlMikpICU+JSANCiAgbG0oZnNfc2NvcmUyIH4gLiwgZGF0YSA9IC4pICU+JSANCiAgICB0aWR5KGNvbmYuaW50ID0gVFJVRSkgJT4lDQogICAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lIA0KICAgIG11dGF0ZSh0ZXJtID0gc3RyX3JlcGxhY2UodGVybSwgImluY29tZV9tcyIsICJpbmNvbWVfc291cmNlIiksDQogICAgICAgICAgIHRlcm0gPSBzdHJfcmVwbGFjZSh0ZXJtLCAiaG9oX2FnZSIsICIiKSwNCiAgICAgICAgICAgdGVybSA9IHN0cl9yZXBsYWNlKHRlcm0sICJob2hfZWR1Y2F0aW9uIiwgIiIpLCANCiAgICAgICAgICAgdGVybSA9IGZjdF9yZW9yZGVyKHRlcm0sIGVzdGltYXRlKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGVzdGltYXRlLCB5ID0gdGVybSwgY29sb3VyID0gZXN0aW1hdGUpKSArIA0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArDQogICAgZ2VvbV9wb2ludCgpICsgDQogICAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIGhlaWdodCA9IDAuMikgKw0KICAgIHNjYWxlX2NvbG91cl92aXJpZGlzKG9wdGlvbiA9ICJ0dXJibyIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDguNSksDQogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkgKw0KICAgIGxhYnMoeCA9ICJFc3RpbWF0ZSIsIHkgPSAiIiwgDQogICAgICAgICB0aXRsZSA9ICJDb2VmZmljaWVudCBwbG90IGZvciBob3VzZWhvbGRzIGluIHRyZWUgbm9kZSBbNl0iKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDEuNSBJbXBhY3Qgb2YgY29uZmxpY3Qgb24gZm9vZCBzZWN1cml0eQ0KDQpDb25mbGljdCBoYXMgYSByZWFsLCB0aG91Z2ggcXVpdGUgbGltaXRlZCBpbXBhY3Qgb24gZm9vZCBzZWN1cml0eS4gVGhvdWdoIHRoZSBGQU8tV0ZQIHN1cnZleSB3YXMgbm90IGRldmVsb3BlZCB3aXRoIG1lYXN1cmluZyB0aGUgaW1wYWN0IG9mIGNvbmZsaWN0IGluIG1pbmQsIGl0IGlzIG5ldmVydGhlbGVzcyBwb3NzaWJsZSB0byBjb250cm9sIGZvciBzb21lIGZhY3RvcnMgYW5kIGV4YW1pbmUgdGhlIGltcGFjdCBvZiBjb25mbGljdCBvbiBzZXZlcmFsIGdyb3Vwcy4gDQoNClRoZSBwbG90IGJlbG93IHNob3dzIHRoZSBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgZm9vZCBzZWN1cml0eSBzY29yZXMgYmFzZWQgb24gd2hldGhlciBhIGhvdXNlaG9sZCBoYXMgYmVlbiBpbXBhY3RlZCBieSBjb25mbGljdCBvciBub3QuIFdlIGhhdmUgc2VsZWN0ZWQgdGhlIHR3byBsYXJnZXN0IGdyb3VwcyB3aXRoaW4gdGhlIHJ1cmFsIGFuZCB1cmJhbiBjb250ZXh0IChmYXJtZXJzIGFuZCB3b3JrZXJzIGVtcGxveWVkIGluIHN0YWJsZSwgbm9uLWFncmljdWx0dXJhbCBlbXBsb3ltZW50KSBhbmQgaGF2ZSBzcGxpdCB0aGVzZSBwb3B1bGF0aW9ucyBieSBlZHVjYXRpb24gbGV2ZWwuIA0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LWNvbmZsaWN0LWltcGFjdH0NCmNvbmZfaW1wYWN0IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGhvaF9lZHVjYXRpb24sIHNob2Nrc19jb25mbGljdCkgJT4lIA0KICAgIGZpbHRlcighaXMubmEoaG9oX2VkdWNhdGlvbiksDQogICAgICAgICAgIGhvaF9lZHVjYXRpb24gIT0gImVkdV9yZWxpZ2lvdXMiKSAlPiUgDQogICAgc3VtbWFyaXNlKG1lYW5fc2NvcmUgPSBtZWFuKGZzX3Njb3JlMikpICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIG11dGF0ZShzaG9ja3NfY29uZmxpY3QgPSByZWNvZGUoc2hvY2tzX2NvbmZsaWN0LCBgMGAgPSAibm8iLCBgMWAgPSAieWVzIiksDQogICAgICAgICAgIHNob2Nrc19jb25mbGljdCA9IGZjdF9yZXYoc2hvY2tzX2NvbmZsaWN0KSwNCiAgICAgICAgICAgaG9oX2VkdWNhdGlvbiA9IGZjdF9yZWxldmVsKGhvaF9lZHVjYXRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJlZHVfbm9uZSIsICJlZHVfcHJpbWFyeSIsICJlZHVfc2Vjb25kYXJ5IiwgImVkdV9oaWdoZXIiKSkpDQp9DQogIA0Kc3VydmV5ICU+JSANCiAgZmlsdGVyKGluY29tZV9tc19zdGFibGVfbm9uX2FnID09IDEgJiBydXJhbCA9PSAwKSAlPiUNCiAgY29uZl9pbXBhY3QoKSAlPiUgDQogIG11dGF0ZShjYXRlZ29yeSA9ICJ1cmJhbl93b3JrZXJzIikgJT4lIA0KICByYmluZCgNCiAgICBzdXJ2ZXkgJT4lIA0KICAgICAgZmlsdGVyKGluY29tZV9tc19hZ3JpY3VsdHVyZSA9PSAxICYgcnVyYWwgPT0gMSkgJT4lIA0KICAgICAgY29uZl9pbXBhY3QoKSAlPiUgDQogICAgICBtdXRhdGUoY2F0ZWdvcnkgPSAicnVyYWxfZmFybWVycyIpDQogICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuX3Njb3JlLCB5ID0gaG9oX2VkdWNhdGlvbiwgZmlsbCA9IHNob2Nrc19jb25mbGljdCkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobWVhbl9zY29yZSwgMykpLCANCiAgICAgICAgICAgIHNpemUgPSAzLjUsIGhqdXN0ID0gLTAuMSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKw0KICBsYWJzKHggPSAiTWVhbiBmb29kIHNlY3VyaXR5IHNjb3JlIiwgeSA9ICJFZHVjYXRpb24gbGV2ZWwsIGhvdXNlaG9sZCBoZWFkIiwNCiAgICAgICBmaWxsID0gInNob2NrOlxuY29uZmxpY3QiLA0KICAgICAgIHRpdGxlID0gIkltcGFjdCBvZiBjb25mbGljdCBvbiBmb29kIHNlY3VyaXR5IikgKw0KICBleHBhbmRfbGltaXRzKHggPSAwLjE2KSArDQogIGZhY2V0X3dyYXAofiBjYXRlZ29yeSkNCmBgYA0KDQo8YnI+DQoNClRoZSBmb29kIHNlY3VyaXR5IHNjb3JlcyBvZiBhbGwgZ3JvdXBzIGV4Y2VwdCBvbmUgYXJlIGhpZ2hlciB3aGVuIGEgaG91c2Vob2xkIGhhcyBleHBlcmllbmNlZCBjb25mbGljdC4gVGhpcyBieSBubyBtZWFucyBjb25zdGl0dXRlcyBhIHNjaWVudGlmaWMgcHJvb2YgKGFub3RoZXIgc3VydmV5IHdvdWxkIGhhdmUgdG8gYmUgY29uZHVjdGVkKSwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIHN0YXRlIHdpdGggc29tZSBjb25maWRlbmNlIHRoYXQgZXhwb3N1cmUgdG8gY29uZmxpY3QgaGFzIGEgbmVnYXRpdmUgaW1wYWN0IG9uIGZvb2Qgc2VjdXJpdHkuIEFuZCBpbiB0aGUgbmV4dCBzZWN0aW9uLCBjb25mbGljdCBzY29yZXMgd2lsbCBiZSB1c2VkIHRvIHByaW9yaXRpc2UgYmV0d2VlbiB0b3duc2hpcHMuDQoNClRvIGNsb3NlLCBiZWxvdyBpcyBhIHRhYmxlIHN1bW1hcmlzaW5nIHRoZSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgaW4gZm9vZCBzZWN1cml0eSBzY29yZXMgb2YgZWFjaCBncm91cC4gQXQgdGhpcyBwb2ludCwgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBpcyB1bmFibGUgdG8gZXN0aW1hdGUgd2l0aCBhbnkgY29uZmlkZW5jZSwgYW4gZXN0aW1hdGUgb2YgdGhlIGVmZmVjdCB0aGF0IGNvbmZsaWN0IGhhcyBvbiBmb29kIHNlY3VyaXR5LiBUaGUgdGFibGUgYmVsb3cgZG9lcyBzaG93cyBzb21lIHdpZGVseSBkaXZlcmdpbmcgdmFsdWVzLCBwcm9iYWJseSBkdWUgdG8gdGhlIHNhbXBsZSBzaXplIGJlaW5nIHRvbyBzbWFsbC4gDQoNCjxicj4NCg0KYGBge3IgdGFibGUtY29uZmxpY3QtaW1wYWN0fQ0Kc3VydmV5ICU+JSANCiAgZmlsdGVyKGluY29tZV9tc19zdGFibGVfbm9uX2FnID09IDEgJiBydXJhbCA9PSAwKSAlPiUNCiAgY29uZl9pbXBhY3QoKSAlPiUgDQogIG11dGF0ZShjYXRlZ29yeSA9ICJ1cmJhbl93b3JrZXJzIikgJT4lIA0KICByYmluZCgNCiAgICBzdXJ2ZXkgJT4lIA0KICAgICAgZmlsdGVyKGluY29tZV9tc19hZ3JpY3VsdHVyZSA9PSAxICYgcnVyYWwgPT0gMSkgJT4lIA0KICAgICAgY29uZl9pbXBhY3QoKSAlPiUgDQogICAgICBtdXRhdGUoY2F0ZWdvcnkgPSAicnVyYWxfZmFybWVycyIpDQogICkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc2hvY2tzX2NvbmZsaWN0LCB2YWx1ZXNfZnJvbSA9IG1lYW5fc2NvcmUsIG5hbWVzX3ByZWZpeCA9ICJjb25mbGljdF8iKSAlPiUgDQogIG11dGF0ZShkaWZmID0gcm91bmQoKGNvbmZsaWN0X3llcyAtIGNvbmZsaWN0X25vKSAvIGNvbmZsaWN0X25vICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZGlmZikpICU+JSANCiAgc2VsZWN0KGNhdGVnb3J5LCBob2hfZWR1Y2F0aW9uLCBgJV9kaWZmZXJlbmNlYCA9IGRpZmYpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBpbiBmb29kIHNlY3VyaXR5IHNjb3JlcyIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMi4gRGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBpbiBNeWFubWFyDQoNCkFwcHJveGltYXRlbHkgNiUgb2YgYWxsIHRoZSBob3VzZWhvbGRzIHN1cnZleWVkIGJ5IEZBTy1XRlAgd2VyZSBkaXJlY3RseSBhZmZlY3RlZCBieSBjb25mbGljdCwgdmlvbGVuY2UgYW5kIGluc2VjdXJpdHkuIFRoaXMgZGlzY291bnRzIGhvdXNlaG9sZHMgdGhhdCBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgdGhlIHNlY29uZGFyeSBpbXBhY3RzIG9mIGNvbmZsaWN0LCBzdWNoIGFzIGxvc3Mgb2YgYWNjZXNzIHRvIG1hcmtldHMgYW5kIGluY3JlYXNlZCBmb29kIHByaWNlcy4gV2hpbHN0IHRoZXJlIGlzIG5vIHNldCB0aHJlc2hvbGQgd2hlcmVieSBvbmUgY2FuIHN0YXRlIHRoYXQgZXZlcnlvbmUgaW4gYSBnaXZlbiBhcmVhIGhhcyBiZWVuIGFmZmVjdGVkIGJ5IGNvbmZsaWN0LCBpdCBpcyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGNvbmZsaWN0IGhhcyBiZWVuIHRoZSBtb3N0IHNldmVyZS4NCg0KU2ltaWxhciB0byBob3cgdGhlIGJhc2ljIGNyaXRlcmlhIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBhdCB0aGUgaG91c2Vob2xkIGxldmVsIHdhcyBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gYWJvdmUsIHRoaXMgc2VjdGlvbiB3aWxsIGZvY3VzIG9uIGhvdyB0byBwcmlvcml0aXNlIGFtb25nc3QgdGhlIHZhcmlvdXMgZ2VvZ3JhcGhpYyBhcmVhcyBpbiBNeWFubWFyLiBGb3IgYSBtb3JlIGNvbXByZWhlbnNpdmUgcmV2aWV3IG9mIGNvbmZsaWN0IGluIE15YW5tYXIsIHBsZWFzZSByZWZlciB0byB0aGUgW0Zvb2QgU2VjdXJpdHkgQ2x1c3RlcidzIFJlcG9ydCBvbiBDb25mbGljdCBEeW5hbWljcyBpbiBNeWFubWFyXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy8pLiANCg0KPGJyPjxicj4NCg0KIyMjIDIuMSBDb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgc3RhdGUvcmVnaW9uDQoNCmBgYHtyIGNvbmZpY3Qtc3RhdGUtYmFycGxvdH0NCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHByb3Rlc3RzX2FuZF9yaW90cywgDQogICAgICAgICBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucykgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYmF0dGxlczp2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyksIG5hbWVzX3RvID0gImV2ZW50X3R5cGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgDQogIGxlZnRfam9pbihmc19waW4gJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUsIHN0YXRlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gc3VtKHZhbHVlKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgLXRvdGFsX2V2ZW50cykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSB2YWx1ZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIHZqdXN0ID0gMC43LCBoanVzdCA9IDAuNyksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkNvbmZsaWN0IGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiMjAyMSBjb25mbGljdCBldmVudHMgYnkgc3RhdGUiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIikNCg0KI2dnc2F2ZSgiZXZlbnRfdHlwZV9zdGF0ZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj4NCg0KU2FnYWluZyBzYXcgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhcyB3ZWxsIGFzIGNvbmZsaWN0IGFzIHdlbGwgYXMgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIGluIDIwMTIuIEl0IGV4cGVyaWVuY2VkIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBhcyBtYW55IGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyB0aGFuIHRoZSBuZXh0LWhpZ2hlc3Qgc3RhdGUvcmVnaW9uIC0tIE1hZ3dheS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IHNoaWZ0IGluIHRoZSBwYXR0ZXJuIG9mIGNvbmZsaWN0IGluIE15YW5tYXIsIHdoaWNoIGhhcyB0cmFkaXRpb25hbGx5IHJldm9sdmVkIGFyb3VuZCBLYWNoaW4sIFJha2hpbmUgYW5kIFNoYW4uIA0KDQpLYXlhaCwgQ2hpbiBhbmQgU2FnYWluZyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGZhdGFsaXRpZXMgcGVyIGNhcGl0YSBpbiAyMDIxLiANCg0KPGJyPg0KDQpgYGB7ciBjb25mbGljdC1mYXRhbGl0aWVzLWJhcnBsb3R9DQoNCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgZmF0YWxpdGllcykgJT4lIA0KICBsZWZ0X2pvaW4oZnNfcGluICU+JSBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgcG9wdWxhdGlvbl8yMDIxX3Byb2opLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCANCiAgICAgICAgICAgIHBvcCA9IHN1bShwb3B1bGF0aW9uXzIwMjFfcHJvaikpICU+JSANCiAgbXV0YXRlKGZhdGFsaXRpZXNfcGMgPSBmYXRhbGl0aWVzIC8gcG9wKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCAtZmF0YWxpdGllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSBmYXRhbGl0aWVzLCBmaWxsID0gZmF0YWxpdGllc19wYykpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIHZqdXN0ID0gMC43LCBoanVzdCA9IDAuNyksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZmF0YWxpdGllcyIsIA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGZhdGFsaXRpZXMgYnkgc3RhdGUiLA0KICAgICAgIHN1YnRpdGxlID0iYW5kIGZhdGFsaXRpZXMgcGVyIGNhcGl0YSIsIA0KICAgICAgIGZpbGwgPSAiZmF0YWxpdGllc1xucGVyIGNhcGl0YSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iKQ0KDQojIGdnc2F2ZSgiZmF0YWxpdGllc19zdGF0ZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMi4yIENvbmZsaWN0IHNjb3JlIGJ5IHRvd25zaGlwDQoNCkFzIGNhbiBiZSBzZWVtIGZyb20gdGhlIGJhcnBsb3RzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0aGUgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBpcyBub3QgZXZlbiwgYmVpbmcgc2tld2VkIHRvIGEgZmV3IHN0YXRlcy9yZWdpb25zLiBUaGlzIGlzIGFsc28gZXZpZGVudCBhdCB0b3duc2hpcCBsZXZlbC4gSW4gdGhlIHNjYXR0ZXJwbG90IGJlbG93LCB0aGUgYXZlcmFnZXMgb2YgdGhlIG51bWJlciBvZiBjb25mbGljdCBldmVudHMgYW5kIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhdCB0aGUgdG93bnNoaXAgbGV2ZWwgaGF2ZSBiZWVuIG1hcmtlZCBieSB0aGUgZG90dGVkIHJlZCBsaW5lcywgZGl2aWRpbmcgdGhlIHBsb3QgaW50byBmb3VyIHF1YWRyYW50cy4gDQoNCkEgcmVxdWlzaXRlIGZvciBhbnkgcHJpb3JpdGlzYXRpb24gc2NvcmUgb3IgaW5kZXggZGV2ZWxvcCBzaG91bGQgYmUgdGFyZ2V0LCBmaXJzdCBhbmQgZm9yZW1vc3QsIHRoZSB0b3duc2hpcHMgaW4gdGhlIHVwcGVyIHJpZ2h0IHF1YWRyYW50IG9mIHRoZSBwbG90LCB3aGljaCBoYXZlIHRoZSBoZWF2aWVzdCBjb25jZW50cmF0aW9ucyBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMuIFRoZXNlIGFyZWFzIGFyZSB3aGVyZSwgYXMgd2UgaGF2ZSBlc3RhYmxpc2hlZCBpbiB0aGUgc2VjdGlvbiBvbiBiZW5lZmljaWFyeSBzZWxlY3Rpb24sIHdoZXJlIHRoZSBoaWdoZXN0IGNvbmNlbnRyYXRpb25zIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIHdpbGwgYmUgZm91bmQuIEZvciByZWZlcmVuY2UsIDU4IHRvd25zaGlwcyBoYXZlIGJvdGggYWJvdmUtYXZlcmFnZSBudW1iZXJzIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyAodXBwZXItcmlnaHQgcXVhZHJhbnQpIGFuZCAxOTYgdG93bnNoaXBzIGhhdmUgYm90aCBiZWxvdy1hdmVyYWdlIG51bWJlcnMgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIChib3R0b20tbGVmdCBxdWFkcmFudCkuIA0KDQo8YnI+DQoNCmBgYHtyIGNvbmZsaWN0LXNjYXR0ZXJwbG90fQ0KY29uZmxpY3Rfc2NhdHRlciA8LSBjb25mbGljdF9zY29yZSAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSBiYXR0bGVzICsgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBwcm90ZXN0c19hbmRfcmlvdHMgKyBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzICsNCiAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JSANCiAgbGVmdF9qb2luKGZzX3BpbiAlPiUgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgcGFydG5lcnNfMjAyMSwgYWRtaW4zX3Bjb2RlLCBwb3B1bGF0aW9uX2RlbnNpdHkpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGZhdGFsaXRpZXMsIHggPSB0b3RhbF9ldmVudHMsIGNvbG91ciA9IHRvdGFsX2V2ZW50cywgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHM6ICIsIHRvdGFsX2V2ZW50cywgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdGFsaXRpZXM6ICIsIGZhdGFsaXRpZXMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0bmVyczogIiwgcGFydG5lcnNfMjAyMSkpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBmYXRhbGl0aWVzKSwgYWxwaGEgPSAwLjg1KSArDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGJyZWFrcyA9IGMoMCwgMSwgMTAsIDMwLCAxMDAsIDMwMCwgMTAwMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAxMCwgMzAsIDEwMCwgMzAwKSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVhbihmYXRhbGl0aWVzKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKHRvdGFsX2V2ZW50cykpLCBjb2xvdXIgPSAicmVkIiwgbHR5ID0gMikgKw0KICBsYWJzKHggPSAiQ29uZmxpY3QgZXZlbnRzIiwgDQogICAgICAgeSA9ICJGYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgdG93bnNoaXAiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNZWFucyBvZiBib3RoIGF4ZXMgYXJlIG1hcmtlZCBieSB0aGUgZG90dGVkIHJlZCBsaW5lIiwNCiAgICAgICBjb2xvdXIgPSAiY29uZmxpY3RcbmV2ZW50cyIsIA0KICAgICAgIHNpemUgPSAiZmF0YWxpdGllcyIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iKSANCg0KZ2dwbG90bHkoY29uZmxpY3Rfc2NhdHRlciwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lIA0KICAjIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSB0b3duc2hpcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IG1lYW5zIG1hcmtlZCBieSByZWQgbGluZXM7IGZhdGFsaXRpZXMgbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQoNCiMgZ2dzYXZlKCJ0c3Bfc2NhdHRlcl9jb25mbGljdC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KDQpgYGANCg0KPGJyPg0KDQpBdCBpdHMgbW9zdCBiYXNpYywgdGhlIGNvbmZsaWN0IHNjb3JlIGlzIGp1c3QgdGhlIGF2ZXJhZ2Ugb2YgYmF0dGxlcywgZXhwbG9zaW9ucywgcmVtb3RlIHZpb2xlbmNlLCB2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucywgc3RyYXRlZ2ljIGRldmVsb3BtZW50cywgbm9uLXBlYWNlZnVsIHByb3Rlc3RzIGFuZCByaW90cyBhbmQgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzLiBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSAqKltGU0MncyBub3RlcyBvbiB1cGRhdGluZyB0aGUgTUlNVS1IQVJQIENvbmZsaWN0IEluZGV4XShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy8jcmV2aXNpdGluZy10aGUtbWltdS1oYXJwLWNvbmZsaWN0LWluZGV4KSoqLiBUaGlzIHNjb3JlIHdpbGwgYmUgbm93IGJlIHVzZWQgYXMgYSBzaG9ydGhhbmQgZm9yIGNvbmZsaWN0IGluY2lkZW5jZSBpbiBNeWFubWFyLg0KDQpJdCBpcyBhZGRpdGlvbmFsbHkgcmVjb2duaXNlZCB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiB0b3duc2hpcHMgbmVjZXNzaXRhdGUgZGlmZmVyZW50IHByb2dyYW1taW5nIG9wdGlvbnMuIEFuZCwgYXMgZXN0YWJsaXNoZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24sIHJ1cmFsIGFuZCB1cmJhbiBhcmVhcyBoYXZlIHdpZGVseSBkaWZmZXJpbmcgbnVtYmVycyBvZiBob3VzZWhvbGRzIGluIHRoZSBwcmlvcml0eSBncm91cC4gVGhlcmVmb3JlLCB0b3duc2hpcHMgaGFjZSBhbHNvIHNwbGl0IGludG8gZm91ciBzaW1wbGUgZ3JvdXBzIChBMSwgQTIsIEIxIGFuZCBCMikgYmFzZWQgb24gdGhlaXIgY29uZmxpY3Qgc2NvcmUgYW5kIHBvcHVsYXRpb24gZGVuc2l0eS4gDQoNClRoaXMgZ3JvdXBpbmcgc2VwYXJhdGVzIGFsbCAzMzAgdG93bnNoaXBzIGFsb25nIHR3byBjcml0ZXJpYSAtLSBoaWdoIChBKSBvciBsb3cgKEIpIGNvbmZsaWN0IHNjb3JlIGFuZCBoaWdoICgxKSBvciBsb3cgKDIpIHBvcHVsYXRpb24gZGVuc2l0eS4gR3JvdXBzIEExIGFuZCBBMiBoYXZlIGFib3ZlIGF2ZXJhZ2UgY29uZmxpY3Qgc2NvcmVzLiBUaGVzZSAxMDcgdG93bnNoaXBzIHNob3VsZCBiZSBwcmlvcml0aXNlZCBmb3IgaHVtYW5pdGFyaWFuIGludGVydmVudGlvbnMuIFJlY2FsbGluZyB0aGUgc2NhdHRlcnBsb3QgYWJvdmUsIHRoZSBjb2xvdXJzIGhhdmUgbm93IGJlZW4gdXBkYXRlZCB0byByZWZsZWN0IHRoZSBwcmlvcml0aXNhdGlvbiBncm91cC4gRnJvbSB0aGUgcGxvdCBiZWxvdyB0aGF0IHdoaWxzdCBncm91cCBBMSBoYXZlIHBvcHVsYXRpb25zIHRoYXQgYXJlIGVhc2llciB0byBhY2Nlc3MgKGhhdmluZyBoaWdoZXIgcG9wdWxhdGlvbiBkZW5zaXR5KSwgdGhlIGluY2lkZW5jZSBvZiBjb25mbGljdCBpcyBoaWdoZXIgb3ZlcmFsbCBpbiBncm91cCBBMiwgd2l0aCB0aGUgbnVtYmVycyBvZiBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgYmVpbmcgbXVjaCBoaWdoZXIuIFRoaXMgcXVpY2stYW5kLWRpcnR5IHByaW9yaXRpc2F0aW9uIGhhcyBtYW5hZ2VkIHRvIGV4Y2x1ZGUgYWxtb3N0IGFsbCB0aGUgdG93bnNoaXBzIGluIGJvdHRvbS1sZWZ0IHF1YWRyYW50IChsZWFzdCBjb25mbGljdC1hZmZlY3RlZCkgZnJvbSBncm91cHMgQTEgYW5kIEEyLiANCg0KPGJyPg0KDQoNCmBgYHtyIHNjYXR0ZXJwbG90LWdyb3Vwc30NCnNjYXR0ZXJfZ3JvdXBzIDwtIGZzX3BpbiAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSBiYXR0bGVzICsgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBwcm90ZXN0c19hbmRfcmlvdHMgKyBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzICsNCiAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdG90YWxfZXZlbnRzLCB5ID0gZmF0YWxpdGllcywgY29sb3VyID0gZ3JvdXAsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXA6ICIsIGdyb3VwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzOiAiLCB0b3RhbF9ldmVudHMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnM6ICIsIHBhcnRuZXJzXzIwMjEpKSkgKw0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gZmF0YWxpdGllcyksIGFscGhhID0gMC44KSArDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGJyZWFrcyA9IGMoMCwgMSwgMTAsIDMwLCAxMDAsIDMwMCwgMTAwMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAxMCwgMzAsIDEwMCwgMzAwKSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM1NzVDNkRGRiIsICIjMDAyMDRERkYiLCAiI0M0QjU2Q0ZGIiwgIiNGRkVBNDZGRiIpKSArDQogICMgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChvcHRpb24gPSAiY2l2aWRpcyIpICsNCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IG1lYW4oZmF0YWxpdGllcywgbmEucm0gPSBUUlVFKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKHRvdGFsX2V2ZW50cywgbmEucm0gPSBUUlVFKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGxhYnMoeCA9ICJDb25mbGljdCBldmVudHMiLCANCiAgICAgICB5ID0gIkZhdGFsaXRpZXMiLA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsIA0KICAgICAgIHN1YnRpdGxlID0gIk1lYW5zIG9mIGJvdGggYXhlcyBhcmUgbWFya2VkIGJ5IHRoZSBkb3R0ZWQgcmVkIGxpbmUiLA0KICAgICAgIGNvbG91ciA9ICJncm91cCIsIA0KICAgICAgIHNpemUgPSAiZmF0YWxpdGllcyIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iKSANCg0KZ2dwbG90bHkoc2NhdHRlcl9ncm91cHMsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgIyBsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFLCBsZWdlbmQgPSBsaXN0KGZvbnQgPSBsaXN0KHNpemUgPSA2KSkpICU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJDb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgcHJpb3JpdGlzYXRpb24gZ3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSBvdmVyIGZvciBkZXRhaWxzOyBtZWFucyBtYXJrZWQgYnkgcmVkIGxpbmVzOyBmYXRhbGl0aWVzIG1hcmtlZCBieSBzaXplIiwiPC9zdXA+IikpKQ0KDQpgYGANCg0KPGJyPg0KDQpHcm91cHMgQTEgYW5kIEEyIGNhbiBiZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZWlyIHBvcHVsYXRpb24gZGVuc2l0eSwgd2l0aCB0aGUgYXZlcmFnZSBwb3B1bGF0aW9uIGRlbnNpdHkgaW4gZ3JvdXAgQTEgYmVpbmcgbW9yZSB0aGFuIDEwMCB0aW1lcyBoaWdoZXIgdGhhbiBpbiBncm91cCBBMi4gVGhlIGF2ZXJhZ2UgUElOIHBlciB0b3duc2hpcCBpcyBzbGlnaHRseSBoaWdoZXIgaW4gZ3JvdXAgQTEgdGhhbiBpbiBncm91cCBBMi4gVGhlIHNjYXR0ZXJwbG90IGJlbG93IHNob3dzIHRvd25zaGlwcyBieSB0aGUgbnVtYmVyIG9mIHBlb3BsZSBpbiBuZWVkICh4LWF4aXMpIGFuZCB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5ICh5LWF4aXMpLCB3aXRoIHRoZSBjb2xvdXJzIHJlZmxlY3Rpbmcgd2hpY2ggZ3JvdXAgZWFjaCBiZWxvbmdzIHRvOg0KDQo8YnI+DQoNCg0KYGBge3J9DQpwb3Bfc2NhdHRlciA8LSBmc19waW4gJT4lIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gYmF0dGxlcyArIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlICsgcHJvdGVzdHNfYW5kX3Jpb3RzICsgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyArDQogICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGZzX3BpbiwgeSA9IHBvcHVsYXRpb25fZGVuc2l0eSwgY29sb3VyID0gZ3JvdXAsDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cDogIiwgZ3JvdXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHM6ICIsIHRvdGFsX2V2ZW50cywgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdGFsaXRpZXM6ICIsIGZhdGFsaXRpZXMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0bmVyczogIiwgcGFydG5lcnNfMjAyMSkpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBjb25mbGljdF9zY29yZSksIGFscGhhID0gMC44KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzU3NUM2REZGIiwgIiMwMDIwNERGRiIsICIjQzRCNTZDRkYiLCAiI0ZGRUE0NkZGIikpICsNCiAgIyBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJjaXZpZGlzIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIHRyYW5zID0gImxvZzEwIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSksIHRyYW5zID0gImxvZzEwIikgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVhbihwb3B1bGF0aW9uX2RlbnNpdHksIG5hLnJtID0gVFJVRSkpLCBjb2xvdXIgPSAicmVkIiwgbHR5ID0gMikgKw0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVhbihmc19waW4sIG5hLnJtID0gVFJVRSkpLCBjb2xvdXIgPSAicmVkIiwgbHR5ID0gMikgKw0KICBsYWJzKHggPSAiUGVvcGxlIGluIG5lZWQiLCANCiAgICAgICB5ID0gIlBvcHVsYXRpb24gZGVuc2l0eSIsDQogICAgICAgdGl0bGUgPSAiUGVvcGxlIGluIG5lZWQgYW5kIHBvcHVsYXRpb24gZGVuc2l0eSBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsIA0KICAgICAgIHN1YnRpdGxlID0gIk1lYW5zIG9mIGJvdGggYXhlcyBhcmUgbWFya2VkIGJ5IHRoZSBkb3R0ZWQgcmVkIGxpbmUiLA0KICAgICAgIGNvbG91ciA9ICJncm91cCIsIA0KICAgICAgIHNpemUgPSAiY29uZmxpY3RcbnNjb3JlIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIpIA0KDQpnZ3Bsb3RseShwb3Bfc2NhdHRlciwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lIA0KICAjIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIlBlb3BsZSBpbiBuZWVkIGFuZCBwb3B1bGF0aW9uIGRlbnNpdHkgYnkgcHJpb3JpdGlzYXRpb24gZ3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSBvdmVyIGZvciBkZXRhaWxzOyBtZWFucyBtYXJrZWQgYnkgcmVkIGxpbmVzOyBjb25mbGljdCBzY29yZSBtYXJrZWQgYnkgc2l6ZSIsIjwvc3VwPiIpKSkNCmBgYA0KDQo8YnI+DQoNClRoZSB0YWJsZSBiZWxvdyBwcm92aWRlcyBzb21lIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgZWFjaCBvZiB0aGUgZm91ciBncm91cHMuIEluY2x1ZGVkIGFyZSB0aGUgUElOIGFuZCBwb3B1bGF0aW9uIHRhcmdldGVkIHdpdGhpbiB0aGUgdG93bnNoaXBzIGluIGVhY2ggZ3JvdXAsIHRoZSBhdmVyYWdlIGNvbmZsaWN0IHNjb3JlIChoaWdoZXIgY29uZmxpY3Qgc2NvcmVzIGluZGljYXRlIGEgaGlnaGVyIGluY2lkZW5jZSBvZiBjb25mbGljdCksIHRoZSBhdmVyYWdlIHBvcHVsYXRpb24gZGVuc2l0eSBhbmQgdGhlIG51bWJlciBvZiB0b3duc2hpcHMgd2l0aGluIGVhY2ggZ3JvdXA6IA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXN1bW1hcnktc3RhdHMtZ3JvdXB9DQpmc19waW4gJT4lIA0KICBncm91cF9ieShncm91cCkgJT4lIA0KICBzdW1tYXJpc2UoUElOID0gc3VtKGZzX3BpbiksIA0KICAgICAgICAgICAgdGFyZ2V0ID0gc3VtKGZzX3RhcmdldGVkKSwNCiAgICAgICAgICAgIGNvbmZsaWN0X3Njb3JlID0gbWVhbihjb25mbGljdF9zY29yZSksDQogICAgICAgICAgICBwcGxfcGVyX2ttMiA9IG1lYW4ocG9wdWxhdGlvbl9kZW5zaXR5KSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG4oKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjKGNvbmZsaWN0X3Njb3JlKSksIH5yb3VuZCguLCBkaWdpdHMgPSAzKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjKFBJTiwgcHBsX3Blcl9rbTIsIHRhcmdldCkpLCB+IHJvdW5kKC4pKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IHRvd25zaGlwIGdyb3VwIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKGZvb3Rub3RlX2FzX2NodW5rID0gVFJVRSwgdGhyZWVwYXJ0dGFibGUgPSBUUlVFLCANCiAgICAgICAgICAgZ2VuZXJhbCA9ICJHcm91cHMgQTEgYW5kIEEyIGhhdmUgYWJvdmUgYXZlcmFnZSBjb25mbGljdCBzY29yZXM7IGdyb3VwcyBBMSBhbmQgQjEgaGF2ZSB0aGUgYWJvdmUgYXZlcmFnZSBwb3B1bGF0aW9uIGRlbnNpdGllcy4gVG93bnNoaXBzIGluIGdyb3VwcyBBMSBhbmQgQTIgc2hvdWxkIGJlIHByaW9yaXRpc2VkIG92ZXIgdGhlIG90aGVycy4iKSANCg0KIyAlPiUNCiMgIHNhdmVfa2FibGUoZmlsZSA9ICJzdW1tYXJ5X3N0YXRzX2dyb3Vwcy5wbmciLCB6b29tID0gMikNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDIuMyBMaW5raW5nIGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24gYW5kIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiANCg0KVXNpbmcgdGhlIGNsYXNzaWZpY2F0aW9ucyBmcm9tIHRoZSBzaW1wbGUgZGVjaXNpb24gdHJlZSBpbiBzZWN0aW9uIDEuMywgd2UgY2FuIHNlZSB0aGF0IGluIHJ1cmFsIGFyZWFzLCB0aGUgaGlnaGVzdCBwcm9wb3J0aW9ucyBvZiBwZW9wbGUgd2hvIGFyZSBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAgYXJlIHRob3NlIHdobyBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgY29uZmxpY3QsIGZvbGxvd2VkIGJ5IHRob3NlIHdobyB3ZXJlIGFmZmVjdGVkIGJ5IGNvbmZsaWN0IGFuZCBoYXZlIGxvc3Qgd29yayBvciBlbXBsb3ltZW50IG9wcG9ydHVuaXRpZXMuIFJ1cmFsIGFyZWFzIHNldmVyZWx5LWFmZmVjdGVkIGJ5IGNvbmZsaWN0ICh0aGUgdG93bnNoaXBzIGluIGdyb3VwIEEyKSBhcmUgdGhlIGFyZWFzIGluIHdoaWNoIHdlIG1heSByZWFjaCBwb3B1bGF0aW9ucyB3aXRoIHRoZSBoaWdoZXN0IHByb3BvcnRpb25zIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwLiANCg0KPGJyPg0KDQpgYGB7cn0NCnN1cnZleSAlPiUgDQogIG11dGF0ZShwcmlvcml0eV9hZGogPSBwcmlvcml0eSAqIGNvbWJpbmVkX3d0KSAlPiUgDQogIGdyb3VwX2J5KHJ1cmFsLCBzaG9ja3NfY29uZmxpY3QsIHNob2Nrc19sb3N0d29yaykgJT4lIA0KICBzdW1tYXJpc2UocHJpb3JpdHkgPSBzdW0ocHJpb3JpdHlfYWRqKSwgDQogICAgICAgICAgICB0b3RhbF9wb3AgPSBzdW0oY29tYmluZWRfd3QpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKHByaW9yaXR5IC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhydXJhbCwgc2hvY2tzX2NvbmZsaWN0LCBzaG9ja3NfbG9zdHdvcmspLCB+cmVjb2RlKC4sIGAwYCA9ICJubyIsIGAxYCA9ICJ5ZXMiKSkgJT4lIA0KICBmaWx0ZXIocGMgPiA0MCkgJT4lDQogIHNlbGVjdCgtcHJpb3JpdHksIC10b3RhbF9wb3ApICU+JSANCiAgcmVuYW1lKGAlX1ByaW9yaXR5YCA9IHBjLA0KICAgICAgICAgUnVyYWwgPSBydXJhbCwgDQogICAgICAgICBTaG9ja3NfQ29uZmxpY3QgPSBzaG9ja3NfY29uZmxpY3QsIA0KICAgICAgICAgU2hvY2tzX0xvc3RfV29yayA9IHNob2Nrc19sb3N0d29yaykgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIldoZXJlIGFyZSB0aGUgaGlnaGVzdCBwcm9wb3J0aW9ucyBvZiBwZXJzb25zIGluIHByaW9yaXR5IGdyb3Vwcz8iKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBjb2x1bW5fc3BlYygxOjQsIHdpZHRoID0gIjhlbSIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlczogQUNMRUQ7IGFjbGVkZGF0YS5jb20gYW5kIEZBTy1XRlAiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+IA0KDQpJbiB1cmJhbiBhcmVhcywgaG93ZXZlciwgY29uZmxpY3QgaW5jaWRlbmNlIGlzIG5vdCBhcyBpbXBvcnRhbnQgb2YgYSBkZXRlcm1pbmluZyBmYWN0b3IgLS0gdGhlIGJlc3QgcmVzdWx0cyBjYW4gYmUgYWNoaWV2ZWQgYnkgdGFyZ2V0aW5nIHBlb3BsZSB3aG8gaGF2ZSBsb3N0IHdvcmsgb3IgZW1wbG95bWVudCBvcHBvcnR1bml0aWVzLCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBvciBub3QgdGhleSBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgY29uZmxpY3QuICANCg0KPGJyPg0KDQpgYGB7cn0NCnN1cnZleSAlPiUgDQogIG11dGF0ZShwcmlvcml0eV9hZGogPSBwcmlvcml0eSAqIGNvbWJpbmVkX3d0KSAlPiUgDQogIGdyb3VwX2J5KHJ1cmFsLCBzaG9ja3NfY29uZmxpY3QsIHNob2Nrc19sb3N0d29yaykgJT4lIA0KICBzdW1tYXJpc2UocHJpb3JpdHkgPSBzdW0ocHJpb3JpdHlfYWRqKSwgDQogICAgICAgICAgICB0b3RhbF9wb3AgPSBzdW0oY29tYmluZWRfd3QpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKHByaW9yaXR5IC8gdG90YWxfcG9wICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhydXJhbCwgc2hvY2tzX2NvbmZsaWN0LCBzaG9ja3NfbG9zdHdvcmspLCB+cmVjb2RlKC4sIGAwYCA9ICJubyIsIGAxYCA9ICJ5ZXMiKSkgJT4lIA0KICBmaWx0ZXIocGMgPD0gNDApICU+JQ0KICBzZWxlY3QoLXByaW9yaXR5LCAtdG90YWxfcG9wKSAlPiUgDQogIHJlbmFtZShgJV9Qcmlvcml0eWAgPSBwYywNCiAgICAgICAgIFJ1cmFsID0gcnVyYWwsIA0KICAgICAgICAgU2hvY2tzX0NvbmZsaWN0ID0gc2hvY2tzX2NvbmZsaWN0LCANCiAgICAgICAgIFNob2Nrc19Mb3N0X1dvcmsgPSBzaG9ja3NfbG9zdHdvcmspICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJXaGljaCBhcmVhcyBoYXZlIGxlc3MgcGVvcGxlIGluIHRoZSBwcmlvcml0eSBncm91cD8iKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBjb2x1bW5fc3BlYygxOjQsIHdpZHRoID0gIjhlbSIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlczogQUNMRUQ7IGFjbGVkZGF0YS5jb20gYW5kIEZBTy1XRlAiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDIuNCBNYXBzIG9mIGNvbmZsaWN0IHNjb3JlcyBhbmQgcHJpb3JpdGlzYXRpb24gZ3JvdXANCg0KYGBge3IgbWFwLWNvbmZsaWN0LXNjb3JlLCBmaWcuaGVpZ2h0PTl9DQoNCmZzX3BpbiAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjb25mbGljdF9zY29yZSksIHNpemUgPSAwLjEpICsgDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJDb25mbGljdCBzY29yZSBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgZmlsbCA9ICJDb25mbGljdFxuc2NvcmUiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSkpICsNCg0KZnNfcGluICU+JSANCiAgbGVmdF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGdyb3VwKSwgc2l6ZSA9IDAuMSwgY29sb3VyID0gImdyYXkyMCIpICsgDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM1NzVDNkRGRiIsICIjMDAyMDRERkYiLCAiI0M0QjU2Q0ZGIiwgIiNGRkVBNDZGRiIpKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzX2QoZW5kID0gMC45LCBvcHRpb24gPSAiY2l2aWRpcyIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgbGFicyh0aXRsZSA9ICJUb3duc2hpcHMgYnkgcHJpb3JpdGlzYXRpb24gZ3JvdXAiLCANCiAgICAgICBmaWxsID0gInByaW9yaS1cbnRpc2F0aW9uXG5ncm91cCIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20gYW5kIEZTQyBjYWxjdWxhdGlvbnMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSkpICANCiAgDQojIGdnc2F2ZSgiY29uZmxpY3Rfc2NvcmVfbWFwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAyLjUgUmVmZXJlbmNlIHRhYmxlIGZvciBjb25mbGljdCB2YXJpYWJsZXMNCg0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBjb25mbGljdCBldmVudHMgYnkgdG93bnNoaXAuIEl0IGFsc28gaW5jbHVkZXMgdGhlIG92ZXJhbGwgY29uZmxpY3Qgc2NvcmUgYW5kIHByaW9yaXRpc2F0aW9uIGdyb3Vwcy4gVGhlIHNlYXJjaCBiYXIgY2FuIGJlIHVzZWQgdG8gZmluZCBzcGVjaWZpYyB0b3duc2hpcHMsIG9yIGFueSBvZiB0aGUgY29sdW1ucyBtYXkgYmUgc29ydGVkIGFjY29yZGluZyB0byBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyB2YWx1ZXMuIFRoZSB0YWJsZSBjdXJyZW50bHkgc2hvd3MgdG93bnNoaXBzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY29uZmxpY3Qgc2NvcmUuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNfcGluICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgcG9wXzIwMjEgPSBwb3B1bGF0aW9uXzIwMjFfcHJvaiwgcHBsX2ttMiA9IHBvcHVsYXRpb25fZGVuc2l0eSwgDQogICAgICAgICBQSU4gPSBmc19waW4sIHRhcmdldCA9IGZzX3RhcmdldGVkLA0KICAgICAgICAgZ3JvdXAsIGNvbmZsaWN0X3Njb3JlLCBmYXRhbGl0aWVzLA0KICAgICAgICAgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHByb3Rlc3RzX2FuZF9yaW90cywgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsDQogICAgICAgICBhZG1pbjNfcGNvZGUpICU+JSANCiAgYXJyYW5nZShkZXNjKGNvbmZsaWN0X3Njb3JlKSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gImNhcHRpb24tc2lkZTogdG9wOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNDAlOyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjEgY29uZmxpY3QgaW5kaWNhdG9ycyBieSB0b3duc2hpcCIpKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInBvcF8yMDIxIiwgInBwbF9rbTIiLCAidGFyZ2V0IiwgIlBJTiIpLCBkaWdpdHMgPSAwKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoImNvbmZsaWN0X3Njb3JlIiksIGRpZ2l0cyA9IDIpDQogDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuIERpc3RyaWJ1dGlvbiBvZiBmbG9vZCByaXNrIGluIE15YW5tYXINCg0KDQojIyMgMy4xIEhpc3RvcmljYWwgZmxvb2QgZGF0YSANCg0KSW4gbGlnaHQgb2YgdGhlIGltcGVuZGluZyBtb25zb29uIHNlYXNvbiwgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSB0b3duc2hpcCB3aWxsIGJlIGFmZmVjdGVkIGJ5IGEgbWFqb3IgZmxvb2Qgb3IgY3lsY29uaWMgZXZlbnQgaGFzIGJlZW4gY2FsY3VsYXRlZC4gTWFqb3IgZmxvb2RzIHNpbmNlIDIwMDggaGF2ZSBiZWVuIGZhY3RvcmVkIGludG8gdGhpcyBjYWxjdWxhdGlvbi4gDQoNCkZvciB0aGUgbW9tZW50LCBjb25mbGljdCBpbmNpZGVuY2UgYW5kIGZsb29kIGFuZCBjeWNsb25lIHJpc2sgd2lsbCBiZSBldmFsdWF0ZWQgc2VwYXJhdGVseS4gRmxvb2QgYW5kIHN0b3JtIHN1cmdlIHJpc2sgZXhpc3QgYXMgcHJvYmFiaWxpdGllcyBmb3IgdGhlIG1vbWVudCBhbmQgYXJlIGludGVuZGVkIHRvIHN1cHBvcnQgcHJlcG9zaXRpb25pbmcgYW5kIERpc2FzdGVyIFJpc2sgUmVkdWN0aW9uOyB0aGlzIG1pZ2h0IGNoYW5nZSB3ZXJlIHNldmVyZSBmbG9vZGluZyB0byBvY2N1ciBpbiAyMDIyLiANCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LWZsb29kLXJpc2t9DQpmbG9vZHNfc3Rvcm1fc3VyZ2UgJT4lIA0KICBzZWxlY3Qoc3RhcnRzX3dpdGgoInllYXJfIiksIGFkbWluM19wY29kZSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoLWFkbWluM19wY29kZSksIG5hbWVzX3RvID0gImZsb29kcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKGZsb29kcyA9IHN0cl9yZW1vdmVfYWxsKGZsb29kcywgInllYXJfIikpICU+JSANCiAgZ3JvdXBfYnkoZmxvb2RzKSAlPiUgDQogIGZpbHRlcih2YWx1ZSA9PSBUUlVFKSAlPiUgDQogIHN1bW1hcmlzZSh0b3duc2hpcHNfYWZmZWN0ZWQgPSBuKCkpICU+JSANCiAgbXV0YXRlKGZsb29kcyA9IGZjdF9yZXYoZmxvb2RzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0b3duc2hpcHNfYWZmZWN0ZWQsIHkgPSBmbG9vZHMsIGZpbGwgPSBmbG9vZHMpKSArIA0KICBnZW9tX2NvbCgpICsgIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh5ID0gIiIsIA0KICAgICAgIHggPSAiTnVtYmVyIG9mIHRvd25zaGlwcyBhZmZlY3RlZCIsIA0KICAgICAgIHRpdGxlID0gIlRvd25zaGlwcyBhZmZlY3RlZCBieSBmbG9vZHMgYW5kIHN0b3JtIHN1cmdlcyAoMjAwOC0yMDIxKSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogTUlNVSBhbmQgVU5EUCIpDQoNCiAjIGdnc2F2ZSgiYnlfZmxvb2RzLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIpDQpgYGANCg0KPGJyPg0KDQpCYXNlZCBvbiB0aGlzIGRhdGEsIGEgc2NvcmUgd2FzIGNhbGN1bGF0ZWQgZm9yIGVhY2ggdG93bnNoaXAgYmFzZWQgb24gaG93IG1hbnkgdGltZXMgaXQgaGFkIGJlZW4gYWZmZWN0ZWQgYnkgZmxvb2RzIHNpbmNlIDIwMDguIFRoZSB0YWJsZSBiZWxvdyBhbHNvIHN1bW1hcmlzZXMgdGhlIG51bWJlciBvZiBwZW9wbGUgaW4gbmVlZCAoMjAyMikuIGByIGZzX3BpbiAlPiUgZmlsdGVyKGZsb29kX2NvdW50ID4gNCkgJT4lIHtzdW0oLiRmc19waW4pfSAlPiUgcm91bmQoKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVvcGxlIGxpdmUgaW4gdG93bnNoaXBzIHRoYXQgaGF2ZSBmbG9vZGVkIG1vcmUgdGhhbiA1IHRpbWVzIHNpbmNlIDIwMDguIA0KDQpgYGB7cn0NCmZzX3BpbiAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChmbG9vZF9jb3VudCA9IDApKSAlPiUgDQogICMgbXV0YXRlKGZsb29kX2NvdW50ID0gaWZlbHNlKGZsb29kX2NvdW50ID4gNCwgIjUtOSIsIGZsb29kX2NvdW50KSkgJT4lIA0KICBncm91cF9ieShmbG9vZF9jb3VudCkgJT4lIA0KICBzdW1tYXJpc2UodG93bnNoaXBzID0gbigpLA0KICAgICAgICAgICAgcGVvcGxlX2luX25lZWQgPSByb3VuZChzdW0oZnNfcGluKSwgZGlnaXRzID0gMCkpICU+JSANCiAgYXJyYW5nZShkZXNjKGZsb29kX2NvdW50KSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlN1bW1hcnkgc3RhdGlzdGljcyBieSBudW1iZXIgb2YgZmxvb2RzICgyMDA4LTIwMjEpIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogTUlNVSBhbmQgVU5EUCIsIGdlbmVyYWxfdGl0bGUgPSAiIikNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgTWFwIG9mIGZsb29kIHJpc2sgDQoNClRoZSBtYXAgYmVsb3cgc2hvd3MgdGhlIHByb2JhYmlsaXR5IG9mIGVhY2ggdG93bnNoaXAgYmVpbmcgYWZmZWN0ZWQgYnkgZmxvb2RzLiBUaGUgYXJlYXMgd2l0aCB0aGUgZ3JlYXRlc3QgcmlzayBvZiBmbG9vZGluZyBhcmUgaW4gTW9uLCBuZWFyIHRoZSBtb3V0aCBvZiB0aGUgU2l0dGF1bmcgUml2ZXIgYW5kIHRoZSBHdWxmIG9mIE1vdHRhbWEgYW5kIHRob3NlIGFsb25nIHRoZSBBeWV5YXJ3YWR5IFJpdmVyLCBhbmQgdG8gYSBsZXNzZXIgZXh0ZW50LCBhbG9uZyB0aGUgQ2hpbmR3aW4gUml2ZXIuIA0KDQo8YnI+DQoNCmBgYHtyIG1hcC1mbG9vZHMsIGZpZy5oZWlnaHQgPSAxMn0NCg0KZnNfcGluICU+JSANCiAgbGVmdF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKHNpemUgPSAwLjEsIGFlcyhmaWxsID0gZmxvb2RfcHJvYikpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBhbHBoYSA9IDAsIGNvbG91ciA9ICJncmF5MjAiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIiwgZGlyZWN0aW9uID0gLTEsIGxhYmVsID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHRpdGxlID0gIkZsb29kIHJpc2sgaW4gTXlhbm1hciAoMjAwOC0yMDIxKSIsIA0KICAgICAgIGZpbGwgPSAiZmxvb2RcbnJpc2siLCANCiAgICAgICBjYXB0aW9uID0gICJEYXRhIHNvdXJjZTogTUlNVSBhbmQgVU5EUCIpDQoNCiMgZ2dzYXZlKCJmbG9vZF9yaXNrLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjMgUmVmZXJlbmNlIHRhYmxlIGZvciBmbG9vZCByaXNrIA0KDQpCZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSByZWZlcmVuY2UgdGFibGUgZm9yIGZsb29kIHJpc2sgYnkgdG93bnNoaXAuIEl0IGluY2x1ZGVzIHRoZSBudW1iZXIgb2YgdGltZXMgc2luY2UgMjAwOCBhIHRvd25zaGlwIGhhcyBiZWVuIGFmZmVjdGVkIGJ5IGZsb29kaW5nIChmbG9vZF9jb3VudCkgYW5kIHRoZSBwcm9iYWJpbGl0eSBvZiBmbG9vZGluZyAoZmxvb2RfcmlzaykuIFNpbWlsYXIgdG8gdGhlIGludGVyYWN0aXZlIHRhYmxlIGluIHRoZSBwcmV2aW91cyBjaGFwdGVyLCB0aGUgc2VhcmNoIGJhciBjYW4gYmUgdXNlZCB0byBmaW5kIHNwZWNpZmljIHRvd25zaGlwcyBhbmQgYW55IG9mIHRoZSBjb2x1bW5zIG1heSBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIHZhbHVlcy4gVGhlIHRhYmxlIGN1cnJlbnRseSBzaG93cyB0b3duc2hpcHMgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgZmxvb2Qgcmlzay4NCg0KPGJyPg0KDQoNCmBgYHtyfQ0KZnNfcGluICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgcG9wXzIwMjEgPSBwb3B1bGF0aW9uXzIwMjFfcHJvaiwgcHBsX2ttMiA9IHBvcHVsYXRpb25fZGVuc2l0eSwgDQogICAgICAgICBQSU4gPSBmc19waW4sIHRhcmdldCA9IGZzX3RhcmdldGVkLA0KICAgICAgICAgZmxvb2RfcmlzayA9IGZsb29kX3Byb2IsIGZsb29kX2NvdW50LA0KICAgICAgICAgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhmbG9vZF9yaXNrKSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gImNhcHRpb24tc2lkZTogdG9wOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNDAlOyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZsb29kIHJpc2sgYnkgdG93bnNoaXAiKSkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJwb3BfMjAyMSIsICJwcGxfa20yIiwgInRhcmdldCIsICJQSU4iKSwgZGlnaXRzID0gMCkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJmbG9vZF9yaXNrIiksIGRpZ2l0cyA9IDIpDQogDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDQuIFRlY2huaWNhbCBub3Rlcw0KDQpUaGVzZSBhbm5leGVzIGNvbnRhaW4gYWRkaXRpb25hbCB0ZWNobmljYWwgaW5mb3JtYXRpb24gdGhhdCBpbmZvcm1lZCB0aGUgZGVjaXNpb25zIGluIHRoZSBlYXJsaWVyIHNlY3Rpb25zLiANCg0KIyMjIDQuMSBMaW1pdGF0aW9ucyBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgDQoNClRoZSBtb3N0IGltcG9ydGFudCBsaW1pdGF0aW9uIG9mIHRoZSBGQU8tV0ZQIHN1cnZleSB3YXMgdGhlIGV4Y2x1c2lvbiBvZiBzZXZlcmFsIGtleSBzdGF0ZXMgYW5kIHJlZ2lvbnMgZnJvbSB0aGUgc3VydmV5LiBPZiBwYXJ0aWN1bGFyIGludGVyZXN0IGFyZSBTYWdhaW5nLCBNYWd3YXkgYW5kIE1hbmRhbGF5IHdoZXJlIHRoZSBjb25mbGljdCBoYXMgYmVlbiBwYXJ0aWN1bGFybHkgaW50ZW5zZS4gQ2hpbiBzdGF0ZSBoYXMgYWxzbyBiZWVuIG1hcmtlZCBhcyAiZmFsc2UiIGJlbG93IHNpbmNlIG9ubHkgNyByZXNwb25kZW50cyB3ZXJlIGludGVydmlld2VkIGluIHRoZSBlbnRpcmUgc3RhdGUuIA0KDQpGdXJ0aGVybW9yZSwgdGhlIGRyeSB6b25lIHdhcyBub3Qgc3VydmV5ZWQuIEZyb20gYW4gYWdyaWN1bHR1cmFsIHBlcnNwZWN0aXZlLCB0aGlzIGlzIGEgbWFqb3Igb21pc3Npb24gYXMgdGhlIGRpdmVyc2l0eSBvZiBjcm9wcyBhbmQsIGNvbnNlcXVlbnRseSwgZGlldHMgYXJlIG11Y2ggaGlnaGVyIGluIHRoZSBkcnkgem9uZSB0aGFuIGluIHRoZSBvdGhlciBwYXJ0cyBvZiB0aGUgY291bnRyeSwgd2hpY2ggYXJlIHByZWRvbWluYW50bHkgZm9jdXNlZCBvbiBwYWRkeS4NCg0KSW4gc3BpdGUgb2YgdGhlc2UgbWFqb3IgbGltaXRhdGlvbnMgYW5kIHRoZSBudW1lcm91cyBhc3N1bXB0aW9ucyB0aGF0IGhhdmUgaGFkIHRvIG1hZGUsIHRoZSBGQU8tV0ZQIHN1cnZleSBpcyBtb3N0IGNvbXByZWhlbnNpdmUgZGF0YXNldCBvbiBmb29kIHNlY3VyaXR5IHRoYXQgaGFzIGJlZW4gY29sbGVjdGVkLiBBZGRpdGlvbmFsIGVmZm9ydHMgd2lsbCBiZSBtYWRlIHRvIGNyb3NzLXJlZmVyZW5jZSB0aGVzZSBkYXRhIGZyb20gdGhvc2Ugb2Ygb3RoZXIgc3VydmV5cy4gVGhlc2UgbW9kZWxzIHdpbGwgYmUgdXBkYXRlZCBvbmNlIHRoZSB0aGlyZCByb3VuZCBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgaXMgcmVhZHkuIEFzIGEgZmluYWwgcG9pbnQgaW4gdGhpcyBzZWN0aW9uLCB0aGUgRkFPLVdGUCBzdXJ2ZXksIGluIHNwaXRlIG9mIGl0cyBsaW1pdGF0aW9ucyBmb3JtcyB0aGUgYmFzaXMgb2YgdGhlIFBlb3BsZSBpbiBOZWVkIGNhbGN1bGF0aW9ucy4gDQoNCg0KPGJyPjxicj4NCg0KDQojIyMgNC4yIExpbmVhciByZWdyZXNzaW9uIG1vZGVsDQoNClByaW9yIHRvIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUgZGVjaXNpb24gdHJlZSBkZXRhaWxlZCBpbiBzZWN0aW9uIDEuMywgYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBoYWQgYmVlbiBjb25zaWRlcmVkLiBIb3dldmVyLCBubyBtYXR0ZXIgaG93IHNvcGhpc3RpY2F0ZWQgdGhlIG1ldGhvZCwgdGhlIGhpZ2hlc3Qgci1zcXVhcmVkIGFjaGlldmVkIHdhcyAwLjEzLiBXaXRoIHJlZmVyZW5jZSB0byB0aGUgcGxvdCBiZWxvdyBvZiBwcmVkaWN0ZWQgYW5kIGFjdHVhbCB2YWx1ZXMgb2YgdGhlIGZvb2Qgc2VjdXJpdHkgc2NvcmUgKG9mIHRoZSBiZXN0IHBlcmZvcm1pbmcgbW9kZWwpLCB3aGlsc3QgdGhlcmUgaXMgYSBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAsIGl0cyBwcmVkaWN0aXZlIHBlcmZvcm1hbmNlIGlzIHRvbyB3ZWFrLiANCg0KPGJyPg0KDQpgYGB7cn0NCm9scyA8LSBzdXJ2ZXkgJT4lIHNlbGVjdChmc19zY29yZTIsIGhvaF9mZW1hbGUsIHJ1cmFsLCBub3RfaW1wcm92ZWRfc2FuaXRhdGlvbiwgDQogICAgICAgICBjb250YWlucygiZWR1XyIpLCBjb250YWlucygic2hvY2tzXyIpLCBjb250YWlucygiaW5jb21lX21zIiksIHN1cnZleV9pZCkgJT4lIA0KICBsZWZ0X2pvaW4oc3VydmV5ICU+JSBzZWxlY3Qoc3VydmV5X2lkLCBob2hfYWdlKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHZhbHVlID0gMSkgJT4lDQogICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBob2hfYWdlLCB2YWx1ZXNfZnJvbSA9IHZhbHVlLCB2YWx1ZXNfZmlsbCA9IDApICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoLWBOQWApLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogIHNlbGVjdCgtc3VydmV5X2lkKSAlPiUNCiAgI3NsaWNlKC1jKCA2OSwgMjk3LCAgNjYwLCAxMTg2LCAxMjIyLCAxMjU2LCAxMzU0LCAxMzYyLCAxNzIwLCANCiAgIyAgICAgICAgICAxODIwLCAxODIzLCAxODQzLCAxOTM2LCAxOTUwLCAxOTUyLCAyMDAzLCAyMTMyLCAyMzI5LCAyNTk0KSkgJT4lIA0KICBkcm9wX25hKCkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmUyID0gbG9nKGZzX3Njb3JlMiksIA0KICAgICAgICAgZnNfc2NvcmUyID0gaWZlbHNlKGlzLmluZmluaXRlKGZzX3Njb3JlMiksIDAsIGZzX3Njb3JlMikpICU+JSANCiAgbG0oZnNfc2NvcmUyIH4gLiwgZGF0YSA9IC4pIA0KDQpzdXJ2ZXkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmUyID0gbG9nKGZzX3Njb3JlMiksIA0KICAgICAgICAgZnNfc2NvcmUyID0gaWZlbHNlKGlzLmluZmluaXRlKGZzX3Njb3JlMiksIDAsIGZzX3Njb3JlMikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcHJlZGljdChvbHMpLCB5ID0gZnNfc2NvcmUyKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGxhYnMoeCA9ICJMb2cgb2YgcHJlZGljdGVkIHZhbHVlcyIsIHkgPSAiTG9nIG9mIGFjdHVhbCB2YWx1ZXMiLCANCiAgICAgICB0aXRsZSA9ICJQcmVkaWN0ZWQgdnMgYWN0dWFsIHZhbHVlcyBmb3IgZm9vZCBzZWN1cml0eSBzY29yZSIpIA0KDQpgYGANCg0KPGJyPg0KDQpUaGUgcmVsYXRpdmVseSBsb3cgci1zcXVhcmVkIGlzIGxpa2VseSBkdWUgdG8gbWlzc2luZyB2YXJpYWJsZXMgaW4gdGhlIEZBTy1XRlAgc3VydmV5LiBGb3IgaW5zdGFuY2UsIHRoZSBmYWN0b3JzIHRoYXQgZ28gaW50byBhIGhvdXNlaG9sZCdzIGRlY2lzaW9uIHRvIHJlZHVjZSB0aGVpciBoZWFsdGhjYXJlIGV4cGVuZGl0dXJlcyBhcmUgdG9vIG11bHRpZmFyaW91cyB0byBiZSBjYXB0dXJlZCBieSBhIHN1cnZleSBvbiBmb29kIHNlY3VyaXR5LiANCg0KVGhpcyBwYXR0ZXJuIHdhcyBhbHNvIHRydWUgZm9yIHRoZSBvdmVyYWxsIGZvb2Qgc2VjdXJpdHkgc2NvcmUgYXMgd2VsbCBhcyB0aGUgaW5kaXZpZHVhbCBmb29kIHNlY3VyaXR5IGluZGljZXMgKEZvb2QgQ29uc3VtcHRpb24gU2NvcmUsIEZvb2QgSW5zZWN1cml0eSBFeHBlcmllbmNlIFNjYWxlIGFuZCBDb3BpbmcgU3RyYXRlZ2llcyBJbmRleCkuDQoNCkZvciBhZGRpdGlvbmFsIHJlZmVyZW5jZSwgdGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSB0b3AgMTUgdmFyaWFibGVzIHJhbmtlZCBieSB0aGUgcGVyY2VudGFnZSBvZiB2YXJpYW5jZSBvZiB0aGUgZm9vZCBzZWN1cml0eSBzY29yZSB0aGF0IHRoZXkgZXhwbGFpbi4gDQoNCjxicj4NCg0KYGBge3IgdGFibGUtcGMtdmFyaWFuY2V9DQpvbHMgJT4lIA0KICBhbm92YSgpICU+JSANCiAgdGlkeSgpICU+JSANCiAgbXV0YXRlKHBjX3ZhcmlhbmNlID0gc3Vtc3EgLyBzdW0oc3Vtc3EpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwY192YXJpYW5jZSkpICU+JSANCiAgc2VsZWN0KHRlcm0sIHBjX3ZhcmlhbmNlKSAlPiUgDQogIG11dGF0ZShwY192YXJpYW5jZSA9IHJvdW5kKHBjX3ZhcmlhbmNlICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBoZWFkKDE1KSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVmFyaWFibGVzIHJhbmtlZCBieSBwZXJjZW50IG9mIHZhcmlhbmNlIikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA0LjMgUGFpcndpc2UgY29ycmVsYXRpb25zIG9mIGluZGljYXRvcnMgaW4gdGhlIEZBTy1XRlAgc3VydmV5DQoNClRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgdG9wIDIwIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdmFyaWFibGVzIGNvbGxlY3RlZCBieSB0aGUgRkFPLVdGUCBmb29kIHNlY3VyaXR5IHN1cnZleS4gV2hlbiBhIHBhcnRpY3VsYXIgdmFyaWFibGUgaXMgb2YgaW50ZXJlc3QsIGl0IG1heSBiZSB1c2VmdWwgYW5kIGludGVyZXN0aW5nIHRvIHNlZSB3aGljaCBvdGhlciB2YXJpYWJsZXMgaXQgaXMgbW9zdCBjb3JyZWxhdGVkIHdpdGguIA0KDQpUaGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgdmFyaWFibGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgY29tcG9zaXRlIHNjb3JlcyBhbmQgaW5kaWNlcywgYXJlIGJpbmFyeSwgd2l0aCAxIGJlaW5nIHRydWUgYW5kIDAgYmVpbmcgZmFsc2UuIEluIHRoZXNlIGNhc2VzLCBhIGNvcnJlbGF0aW9uIG9mIDEgd291bGQgbWVhbiB0aGF0IGEgdmFyaWFibGUgaXMgdHJ1ZSBmb3IgYWxsIHRoZSBob3VzZWhvbGRzIGluIHdoaWNoIGl0cyBtYXRjaCBpcyBhbHNvIHRydWU7IGEgY29ycmVsYXRpb24gb2YgMC41IG1lYW5zIHRoYXQgYSB2YXJpYWJsZSBpcyB0cnVlIGZvciA1MCUgb2YgdGhlIGhvdXNlaG9sZHMgaW4gd2hpY2ggaXRzIG1hdGNoIGlzIHRydWUuIA0KDQpGb3IgaW5zdGFuY2UsIHdoZXRoZXIgb3Igbm90IHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQgaGFzIGNvbXBldGVkIGVkdWNhdGlvbiAoKmVkdV9oaWdoZXIqKSBpcyBtb3N0IGNvcnJlbGF0ZWQgd2l0aCBob3VzZWhvbGRzIHdob3NlIG1haW4gaW5jb21lIHNvdXJjZSBpcyBzdGFibGUgbm9uLWFncmljdWx0dXJhbCBpbmNvbWUgKCppbmNvbWVfbXNfc3RhYmxlX25vbl9hZyopLiBIb3dldmVyLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgY29tcG9uZW50cyBvZiB0aGUgZm9vZCBzZWN1cml0eSBpbmRpY2VzIHRlbmRlZCB0byBvbmx5IGJlIGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyLCBhZ2FpbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGVudmlyb25tZW50YWwgYW5kIGRlbW9ncmFwaGljIHZhcmlhYmxlcyBjb2xsZWN0ZWQgYXJlIG5vdCBzdWZmaWNpZW50IHRvIGV4cGxhaW4gdGhlIHZhcmlhbmNlIGluIGZvb2Qgc2VjdXJpdHkuIA0KDQoNCjxicj4NCg0KYGBge3J9DQpzdXJ2ZXlfbG9uZyAlPiUNCiAgZ3JvdXBfYnkodmFyKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IGlmZWxzZSh2YWx1ZSA+IDAsIDEsIDApLA0KICAgICAgICAgY291bnQgPSBzdW0oY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcihjb3VudCA+IDUwKSAlPiUgIyBhZGp1c3QgdGhlIHRocmVzaG9sZCBuDQogIHBhaXJ3aXNlX2Nvcih2YXIsIHN1cnZleV9pZCwgdmFsdWUgPSB2YWx1ZSwgc29ydCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHZhcmlhYmxlID0gaXRlbTEsIG1hdGNoID0gaXRlbTIpICU+JSANCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JSANCiAgdG9wX24oYWJzKGNvcnJlbGF0aW9uKSwgbiA9IDIwKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaCA9IGxpc3QocmVnZXggPSBUUlVFKSkpICU+JSANCiAgZm9ybWF0Um91bmQoYygiY29ycmVsYXRpb24iKSwgZGlnaXRzID0gMykNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC40IENhbGN1bGF0aW5nIHRoZSBjb25mbGljdCBzY29yZQ0KDQpVc2luZyBBQ0xFRCBkYXRhLCBhIGNvbmZsaWN0IHNjb3JlIHdhcyBjYWxjdWxhdGVkIGF0IHRvd25zaGlwIGxldmVsLiBUaGUgY29uZmxpY3Qgc2NvcmUgaGVyZSBpcyBhbiB1cGRhdGUgb2YgdGhlIGNvbmZsaWN0IGluZGV4IGluIHRoZSBbTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgQW5hbHlzaXNdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKSwgdXNpbmcgMjAyMSBkYXRhLiBUaGUgc3BlY2lmaWMgY29uZmxpY3QgdmFyaWFibGVzIHRoYXQgaW5jbHVkZWQgaW4gdGhlIHNjb3JlIHdlcmUgYmF0dGxlcywgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlLCBub24tcGVhY2VmdWwgcHJvdGVzdHMgYW5kIHJpb3RzLCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgYW5kIHN0cmF0ZWdpYyBkZXZlbG9wbWVudHMuIA0KDQpBIGNvbmZsaWN0IHNjb3JlLCBhdCBpdHMgbW9zdCBiYXNpYywgaXMgYW4gYXZlcmFnZSBvZiB0aGUgbm9ybWFsaXNlZCB2YWx1ZXMgb2Yga2V5IGNvbmZsaWN0IGluZGljYXRvcnMuIEl0cyBtYWluIHVzZSBpdCB0byBhaWQgZGVjaXNpb25zIGFib3V0IGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24uIFRoZXNlIG5vcm1hbGlzZWQgdmFsdWVzIGhhdmUgYmVlbiByZS13ZWlnaHRlZCB3aXRoIEJldHRpLVZlcm1hIG1ldGhvZCwgd2hpY2ggcGVuYWxpc2VzIHJlZHVuZGFuY3kgYW5kIHJld2FyZHMgdmFyaWF0aW9uOyB0aGlzIGlzIHRoZSBvbmx5IG5vdGFibGUgZGl2ZXJnZW5jZSBmcm9tIHRoZSBNSU1VLUhBUlAgbWV0aG9kb2xvZ3kuIFRoZSBCZXR0aS1WZXJtYSBtZXRob2Qgd2FzIGVtcGxveWVkIHRocm91Z2ggdGhlICoqYG1kZXByaXZgKiogcGFja2FnZSBkZXZlbG9wZWQgYnkgQXR0aWxpbyBhbmQgQWxkbyBCZW5pbmkuIFRoZSBzcGVjaWZpYyBmb3JtdWxhIHVzZWQgaW4gdGhlIGRldmVsb3BtZW50IG9mIHRoZSBzY29yZSBjYW4gZm91bmQgYnkgZG93bmxvYWRpbmcgdGhlIGNvZGUgYXQgdGhlIHRvcC1yaWdodCBjb3JuZXIgb2YgdGhlIHBhZ2UuIA0KDQo=